home *** CD-ROM | disk | FTP | other *** search
/ Compendium Deluxe 2 / LSD and 17bit Compendium Deluxe - Volume II.iso / a / prog / asmsrc / technowar.lha / SourceCode / techno.s
Text File  |  1990-09-13  |  51KB  |  2,819 lines

  1.     Section    Demo,Code_C
  2.  
  3.     Opt    C-,O+,w-
  4.  
  5.  
  6. down1        = 102*40
  7. down2        = 168*40
  8.  
  9. swide    = 44
  10.  
  11. headspeed    = 3    
  12. time        = 900*headspeed
  13. load        = 14        ; trap number to nondos load
  14.  
  15. bgc        = $dff1fe
  16.     
  17. Start:    move.w    #$7fff,$dff096
  18.     move.w    #$7fff,$dff098
  19.     move.w    #$7fff,$dff09a
  20.     move.w    #$7fff,$dff09c
  21.     move.w    #$7fff,$dff09e
  22.     
  23.     move.l    #0,0
  24.  
  25.     move.l    $80,a0
  26.     move.l    a0,volumespace    
  27.     add.l    #$18000,a0
  28.     move.l    a0,my_mem
  29.  
  30.     lea    loadtracks(pc),a0
  31.     move.l    a0,$80+(4*load)
  32.  
  33.     lea    $dff000,a5        ; hardware base address
  34.  
  35.     Move.w    $1c(a5),OldInt    ; Save Old Interupts
  36.     Move.w    $02(a5),OldDma    ; Save Old DMA
  37.  
  38.     Move.w    #$7fff,$9a(a5)    ; Clear DMA
  39.     Move.w    #$7fff,$96(a5)    ; Clear Interupts
  40.     Move.w    #$7fff,$9c(a5)    ; Clear Interupt Requests
  41.     
  42.     Move.l    $6c.w,OldV3        ; save level 3 int
  43.     move.l    $78,old
  44.  
  45.     Move.l    #my_level3,$6c.w    ; put new copper interupt
  46.     Move.l    #my_copper,$80(a5)     ; Address of copper 1
  47.     move.l    #l6int,$78
  48.  
  49.     Move.w    #$e010,$9a(a5)    ; Start interupts
  50.     Move.w    #$83df,$96(a5)    ; Start DMA
  51.     Move.w    #1,$88(a5)        ; Strobe for copper start
  52.  
  53.     MOVE.L    #1773447,D7 ; PAL
  54.     move.l    d7,timervalue    
  55.     divu    #125,D7         ; Default to normal 50 Hz timer
  56.     move.w    d7,ciatime
  57.  
  58.     move.b    #$7f,$bfdd00
  59.     move.b    #%00010001,$bfde00    ; cra
  60.     move.b    #%10000001,$bfdd00    ; icr
  61.     move.b    ciatime+0,$bfd400
  62.     move.b    ciatime+1,$bfd500
  63.  
  64.     move.l    #scrollmem,d0
  65.     move.w    d0,splane0_lo
  66.     swap    d0
  67.     move.w    d0,splane0_hi
  68.     swap    d0
  69.     add.l    #swide,d0
  70.     move.w    d0,splane1_lo
  71.     swap    d0
  72.     move.w    d0,splane1_hi
  73.     swap    d0
  74.     add.l    #swide,d0
  75.     move.w    d0,splane2_lo    
  76.     swap    d0
  77.     move.w    d0,splane2_hi
  78.  
  79.     move.b    #$30,pic_down
  80.  
  81.     move.l    #intro_pic,iff
  82.     bsr    show_iff
  83.     move.l    #0,d0
  84.     bsr    fadein
  85.  
  86.     bsr    loadmodule
  87.     add.l    #20,diskptr
  88.  
  89.     move.l    #0,d0
  90.     bsr    fadeout
  91.  
  92.     move.b    #$1c,pic_down
  93.  
  94.     st    equon
  95.  
  96.     bsr    mt_init
  97.     st    mt_enable
  98.  
  99.     move.l    #main_pic,iff
  100.     bsr    show_iff
  101.     move.l    #0,d0
  102.     bsr    fadein
  103.  
  104.     move.l    mt_data1,d0
  105.     move.l    mt_data2,d1
  106.     move.l    d0,mt_data2
  107.     move.l    d1,mt_data1
  108.  
  109. next_module:
  110.  
  111.     bsr    loadmodule
  112.     add.l    #20,diskptr
  113.  
  114. .wait    cmp.w    #-1,songended
  115.     bne    .wait
  116.  
  117.     sf    mt_enable
  118.     bsr    mt_init
  119.     st    mt_enable
  120.  
  121.     move.l    mt_data1,d0
  122.     move.l    mt_data2,d1
  123.     move.l    d0,mt_data2
  124.     move.l    d1,mt_data1
  125.  
  126.     move.l    diskptr,a6
  127.     cmp.l    #-1,(a6)
  128.     bne    next_module
  129.  
  130.     move.l    #diskmap,diskptr
  131.     bra    next_module
  132.     
  133. quit:
  134.     lea    $dff000,a5        ; hardware base address
  135.     move.l    #0,$80(a5)        ; blank copper list
  136.     move.l    #0,$84(a5)        ; if gfx lib not open (slayer boot)
  137.     move.w    #0,$180(a5)        ; bgc to black
  138.     
  139.     Move.l    OldV3,$6c.w        ; restore old l3
  140.     
  141.     bsr    mt_end
  142.     move.l    old,$78
  143.  
  144.     Lea    GfxLib,a1        ; Pointer to Library Text
  145.     move.l    4.w,a6
  146.     jsr    -132(a6)            ; forbid
  147.     Move.l    4.w,a6            ; Exec
  148.     Moveq.l    #0,d0            ; Clear D0
  149.     Jsr    -$228(a6)        ; Open Library
  150.     cmp.l    #0,d0
  151.     beq    no_gfx_lib        ; if gfx lib not open dont restore copper lib (slayer boot)
  152.     
  153.     Move.l    d0,a1            
  154.     Move.l    $26(a1),$80(a5)        ; restore copper 1
  155.     Move.l    $32(a1),$84(a5)        ; restore copper 2
  156.  
  157. no_gfx_lib:
  158.  
  159.     Move.w    OldInt,d0        ; start old interupts
  160.     Or.w    #$8000,d0
  161.     Move.w    d0,$9a(a5)
  162.     Move.w    OldDma,d0        ; start old DMA
  163.     Or.w    #$8000,d0
  164.     Move.w    d0,$96(a5)
  165.     Move.b    #$9b,$bfed01        ; Start Timers
  166.     Move.l    4.w,a6            ; Close Gfx lib
  167.     Jsr    -$19e(a6)
  168.     move.l    4.w,a6
  169.     jsr    -138(a6)            ; permit
  170.  
  171.     move.w    #0,$bfec00        ; clear kbd
  172.  
  173.     Moveq.l    #0,d0            ; No errors
  174.     Rts                ; Exit
  175.  
  176.     ****************************************************
  177.  
  178. my_level3:
  179.     Movem.l    d0-d7/a0-a6,-(a7)        ; New copper
  180.     Move.w    #$10,$dff09c        ; Serviced Interupt
  181.  
  182.     tst.b    equon
  183.     beq    exit
  184.  
  185.     move.l    screen1c,d0
  186.     move.w    d0,bitplane4_lo
  187.     swap    d0
  188.     move.w    d0,bitplane4_hi
  189.  
  190.     move.l    screen1b,a1
  191.     move.l    a1,$dff054            ; dest mem d
  192.     Move.w    #$0000,$dff044            ; blit 1st word mask source a
  193.     Move.w    #$0000,$dff046            ; blit last word mask source a
  194.     move.w    #%0001*256+0,$dff040        ; blit cont reg 0
  195.     move.w    #0,$dff042            ; blit cont reg 1
  196.     Move.w    #0,$dff066            ; modulo for dest
  197.     Move.w    #256*64+20,$dff058        ; blit height,width
  198.  
  199.     bsr    extract_sound    
  200.     
  201.         *************
  202.     
  203.     moveq    #0,d0
  204.     cmp.w    #0,showlen1
  205.     bmi    len_ok1
  206.     LEA    mt_chan1temp,A6
  207.     clr.l    d0
  208.     MOVE.W    n_period(A6),D0
  209.     beq    len_ok1
  210.     move.l    #35469,d1
  211.     divu    d0,d1
  212.     ext.l    d1
  213.     sub.w    d1,showlen1
  214.     add.l    d1,showsound1
  215.  
  216. len_ok1:
  217.     cmp.w    #0,showlen2
  218.     bmi    len_ok2
  219.     LEA    mt_chan2temp,A6
  220.     clr.l    d0
  221.     MOVE.W    n_period(A6),D0
  222.     beq    len_ok2
  223.     move.l    #35469,d1
  224.     divu    d0,d1
  225.     ext.l    d1
  226.     sub.w    d1,showlen2
  227.     add.l    d1,showsound2
  228. len_ok2:
  229.     cmp.w    #0,showlen3
  230.     bmi    len_ok3
  231.     LEA    mt_chan3temp,A6
  232.     clr.l    d0
  233.     MOVE.W    n_period(A6),D0
  234.     beq    len_ok3
  235.     move.l    #35469,d1
  236.     divu    d0,d1
  237.     ext.l    d1
  238.     sub.w    d1,showlen3
  239.     add.l    d1,showsound3
  240.  
  241.  
  242. len_ok3:
  243.     cmp.w    #0,showlen4
  244.     bmi    len_ok4
  245.     LEA    mt_chan4temp,A6
  246.     clr.l    d0
  247.     MOVE.W    n_period(A6),D0
  248.     beq    len_ok4
  249.     move.l    #35469,d1
  250.     divu    d0,d1
  251.     ext.l    d1
  252.     sub.w    d1,showlen4
  253.     add.l    d1,showsound4
  254. len_ok4:
  255.  
  256.         *************
  257.  
  258.     bsr    wtblit
  259.  
  260.     move.l    screen1a,d0
  261.     move.l    screen1b,d1
  262.     move.l    screen1c,d2
  263.     
  264.     move.l    d1,screen1a
  265.     move.l    d2,screen1b
  266.     move.l    d0,screen1c
  267.  
  268.     bsr    scroll_text
  269.     
  270.     move.w    #$444,bgc
  271.  
  272. Exit:    Movem.l    (a7)+,d0-d7/a0-a6
  273.     Rte            ; Return from Interupt
  274.  
  275.  
  276.     ********************************************************
  277.     
  278. scroll_text:
  279.     sub.w    #$22,scroll_off+2
  280.     move.w    scroll_off+2,d0
  281.     cmp.w    scroll_trigger,d0
  282.     bgt    scroll_ok
  283.     
  284.     move.w    #$ff,scroll_off+2
  285.         
  286.     lea    scrollmem,a3
  287.     move.l    a3,a2
  288.     add.l    #2,a2
  289.  
  290.     move.w    #(%1001*256)+$f0,d0
  291.  
  292.     cmp.w    #$00,scroll_trigger
  293.     beq    .not_sub
  294.     
  295.     or.w    #(8192*4),d0
  296. .not_sub
  297.     
  298.     Move.l    a3,$dff054        ; dest mem d
  299.     Move.l    a2,$dff050        ; source mem a
  300.     Move.w    #$ffff,$dff044    ; blit 1st word mask source a
  301.     move.w    #$ffff,$dff046    ; blit last word mask source a
  302.     move.w    #0,$dff064        ; blit modulo for source a
  303.     move.w    d0,$dff040
  304.     move.w    #0,$dff042        ; blit cont reg 1
  305.     Move.w    #0,$dff066        ; modulo for dest
  306.     Move.w    #(64*64)+(swide/2),$dff058    ; blit height,width
  307.  
  308.     bsr    do_blit
  309.     
  310.     move.w    #$00,scroll_trigger
  311.  
  312.     move.l    scroll_ptr,a0
  313. .badchr    add.l    #1,scroll_ptr
  314.     
  315.     clr.l    d0
  316.     move.b    (a0)+,d0
  317.     cmp.b    #10,d0
  318.     beq    .badchr
  319.     cmp.b    #0,d0
  320.     bne.s    scroller_ended
  321.     
  322.     move.l    #scrolltext,scroll_ptr
  323.     move.b    #32,d0
  324. scroller_ended:
  325.     cmp.b    #"I",d0
  326.     beq    .small_chr
  327.     cmp.b    #"1",d0
  328.     beq    .small_chr
  329.     cmp.b    #"!",d0
  330.     beq    .small_chr
  331.     cmp.b    #"'",d0
  332.     beq    .small_chr
  333.     cmp.b    #",",d0
  334.     beq    .small_chr
  335.     cmp.b    #".",d0
  336.     bne    .not_small_chr
  337. .small_chr
  338.     move.w    #$88,scroll_trigger
  339. .not_small_chr    
  340.  
  341.     lea    scrollmem,a3
  342.     add.l    #swide-2,a3
  343.  
  344.     sub.b    #32,d0
  345.     mulu    #2,d0
  346.     add.l    #sfont,d0
  347.     move.l    d0,a2
  348.     
  349.     Move.l    a3,$dff054        ; dest mem d
  350.     Move.l    a2,$dff050        ; source mem a
  351.     Move.w    #$ffff,$dff044        ; blit 1st word mask source a
  352.     move.w    #$ffff,$dff046        ; blit last word mask source a
  353.     move.w    #118-2,$dff064        ; blit modulo for source a
  354.     move.w    #(%1001*256)+$f0,$dff040    ; 
  355.     move.w    #0,$dff042        ; blit cont reg 1
  356.     Move.w    #swide-2,$dff066        ; modulo for dest
  357.     Move.w    #(64*64)+1,$dff058    ; blit height,width
  358.     
  359.     bsr    do_blit
  360. scroll_ok:    
  361.     rts
  362.     
  363. do_blit:
  364.     Btst.b    #6,$dff002
  365.     Bne.s    do_blit
  366.     rts
  367.  
  368.  
  369.     ********************************************************
  370.  
  371. extract_sound:
  372.     move.l    screen1a,a1
  373.     add.l    #down1,a1    
  374.     move.l    showsound1,a0
  375.     move.l    #0,a3
  376.     move.w    showlen1,a3
  377.     bsr    waveform
  378.  
  379.     move.l    screen1a,a1
  380.     add.l    #down1+20,a1    
  381.     move.l    showsound2,a0
  382.     move.w    showlen2,a3
  383.     bsr    waveform
  384.  
  385.     move.l    screen1a,a1
  386.     add.l    #down2,a1    
  387.     move.l    showsound3,a0
  388.     move.w    showlen3,a3
  389.     bsr    waveform
  390.  
  391.     move.l    screen1a,a1
  392.     add.l    #down2+20,a1    
  393.     move.l    showsound4,a0
  394.     move.w    showlen4,a3
  395.     bsr    waveform
  396.     
  397.     rts
  398.  
  399.  
  400. waveform:
  401.     cmp.w    #160,a3
  402.     bpl    sound_loop_ok
  403.     
  404.     lea    null_sample,a0
  405.     
  406. sound_loop_ok:
  407.     move.w    #159,d0
  408.     lea    table,a6
  409.     
  410. sound_loop:
  411.     move.w    d0,d1
  412.     and.w    #7,d1
  413.  
  414.     moveq    #0,d2
  415.     move.b    (a0),d2
  416.     and.w    #254,d2
  417.     move.w    (a6,d2.w),d2        ; get y pos
  418.  
  419.     bset.b    d1,(a1,d2.w)        ; set bit
  420.  
  421.     cmp.b    #0,d1
  422.     bne.s    no_add_a1    
  423.     add.l    #1,a1
  424. no_add_a1
  425.     add.l    #1,a0
  426.  
  427.     dbf    d0,sound_loop
  428.     
  429.     rts
  430.  
  431. wtblit:    Btst.b    #6,$dff002
  432.     Bne.s    wtblit
  433.     rts
  434.  
  435.     ********************************************************
  436.  
  437.     *********
  438.  
  439. l6int:    move.w    #$2000,$dff09c
  440.     tst.b    $bfdd00
  441.  
  442.     move.w    ciatime,ciatime2
  443.     not.w    ciatime2
  444.     move.b    ciatime2+1,$bfe400
  445.     move.b    ciatime2+0,$bfe500
  446.  
  447.     bsr    mt_music
  448.  
  449.     rte
  450.  
  451. RealTempo    dc.w    125
  452. TimerValue    dc.l     0
  453. ciatime:        dc.l    0
  454. old:        dc.l    0
  455.  
  456. n_note        EQU    0  ; W
  457. n_cmd        EQU    2  ; W
  458. n_cmdlo        EQU    3  ; B
  459. n_start        EQU    4  ; L
  460. n_length        EQU    8  ; W
  461. n_loopstart    EQU    10 ; L
  462. n_replen        EQU    14 ; W
  463. n_period        EQU    16 ; W
  464. n_finetune    EQU    18 ; B
  465. n_volume        EQU    19 ; B
  466. n_dmabit        EQU    20 ; W
  467. n_toneportdirec    EQU    22 ; B
  468. n_toneportspeed    EQU    23 ; B
  469. n_wantedperiod    EQU    24 ; W
  470. n_vibratocmd    EQU    26 ; B
  471. n_vibratopos    EQU    27 ; B
  472. n_tremolocmd    EQU    28 ; B
  473. n_tremolopos    EQU    29 ; B
  474. n_wavecontrol    EQU    30 ; B
  475. n_glissfunk    EQU    31 ; B
  476. n_sampleoffset    EQU    32 ; B
  477. n_pattpos    EQU    33 ; B
  478. n_loopcount    EQU    34 ; B
  479. n_funkoffset    EQU    35 ; B
  480. n_wavestart    EQU    36 ; L
  481. n_reallength    EQU    40 ; W
  482.  
  483. mt_init    MOVE.L    #1773447,D7 ; PAL
  484.     move.l    d7,timervalue    
  485.     divu    #125,D7             ; Default to normal 50 Hz timer
  486.     move.w    d7,ciatime
  487.  
  488.     move.w    #0,songended
  489.     move.l    mt_data1,A0
  490.     MOVE.L    A0,mt_SongDataPtr
  491.     MOVE.L    A0,A1
  492.     LEA    952(A1),A1
  493.     MOVEQ    #127,D0
  494.     MOVEQ    #0,D1
  495. mtloop    MOVE.L    D1,D2
  496.     SUBQ.W    #1,D0
  497. mtloop2    MOVE.B    (A1)+,D1
  498.     CMP.B    D2,D1
  499.     BGT.S    mtloop
  500.     DBRA    D0,mtloop2
  501.     ADDQ.B    #1,D2
  502.             
  503.     LEA    mt_SampleStarts(PC),A1
  504.     ASL.L    #8,D2
  505.     ASL.L    #2,D2
  506.     ADD.L    #1084,D2
  507.     ADD.L    A0,D2
  508.     MOVE.L    D2,A2
  509.     MOVEQ    #30,D0
  510. mtloop3    CLR.L    (A2)
  511.     MOVE.L    A2,(A1)+
  512.     MOVEQ    #0,D1
  513.     MOVE.W    42(A0),D1
  514.     ASL.L    #1,D1
  515.     ADD.L    D1,A2
  516.     ADD.L    #30,A0
  517.     DBRA    D0,mtloop3
  518.  
  519.     OR.B    #2,$BFE001
  520.     MOVE.B    #6,mt_speed
  521.     CLR.B    mt_counter
  522.     CLR.B    mt_SongPos
  523.     CLR.W    mt_PatternPos
  524. mt_end    SF    mt_Enable
  525.     LEA    $DFF000,A0
  526.     CLR.W    $A8(A0)
  527.     CLR.W    $B8(A0)
  528.     CLR.W    $C8(A0)
  529.     CLR.W    $D8(A0)
  530.     MOVE.W    #$F,$DFF096
  531.     RTS
  532.  
  533. mt_music
  534.     MOVEM.L    D0-D4/A0-A6,-(SP)
  535.     TST.B    mt_Enable
  536.     BEQ    mt_exit
  537.     ADDQ.B    #1,mt_counter
  538.     MOVE.B    mt_counter(PC),D0
  539.     CMP.B    mt_speed(PC),D0
  540.     BLO.S    mt_NoNewNote
  541.     CLR.B    mt_counter
  542.     TST.B    mt_PattDelTime2
  543.     BEQ.S    mt_GetNewNote
  544.     BSR.S    mt_NoNewAllChannels
  545.     BRA    mt_dskip
  546.  
  547. mt_NoNewNote
  548.     BSR.S    mt_NoNewAllChannels
  549.     BRA    mt_NoNewPosYet
  550.  
  551. mt_NoNewAllChannels
  552.     LEA    $DFF0A0,A5
  553.     LEA    mt_chan1temp(PC),A6
  554.     BSR    mt_CheckEfx
  555.     LEA    $DFF0B0,A5
  556.     LEA    mt_chan2temp(PC),A6
  557.     BSR    mt_CheckEfx
  558.     LEA    $DFF0C0,A5
  559.     LEA    mt_chan3temp(PC),A6
  560.     BSR    mt_CheckEfx
  561.     LEA    $DFF0D0,A5
  562.     LEA    mt_chan4temp(PC),A6
  563.     BRA    mt_CheckEfx
  564.  
  565. mt_GetNewNote
  566.     MOVE.L    mt_SongDataPtr(PC),A0
  567.     LEA    12(A0),A3
  568.     LEA    952(A0),A2    ;pattpo
  569.     LEA    1084(A0),A0    ;patterndata
  570.     MOVEQ    #0,D0
  571.     MOVEQ    #0,D1
  572.     MOVE.B    mt_SongPos(PC),D0
  573.     MOVE.B    (A2,D0.W),D1
  574.     ASL.L    #8,D1
  575.     ASL.L    #2,D1
  576.     ADD.W    mt_PatternPos(PC),D1
  577.     CLR.W    mt_DMACONtemp
  578.  
  579.     LEA    $DFF0A0,A5
  580.     LEA    mt_chan1temp(PC),A6
  581.     move.l    #showsound1,ss
  582.     move.l    #showlen1,sl
  583.     BSR    mt_PlayVoice
  584.     
  585.     LEA    $DFF0B0,A5
  586.     LEA    mt_chan2temp(PC),A6
  587.     move.l    #showsound2,ss
  588.     move.l    #showlen2,sl
  589.     BSR.S    mt_PlayVoice
  590.     
  591.     LEA    $DFF0C0,A5
  592.     LEA    mt_chan3temp(PC),A6
  593.     move.l    #showsound3,ss
  594.     move.l    #showlen3,sl
  595.     BSR.S    mt_PlayVoice
  596.     
  597.     LEA    $DFF0D0,A5
  598.     LEA    mt_chan4temp(PC),A6
  599.     move.l    #showsound4,ss
  600.     move.l    #showlen4,sl
  601.     BSR.S    mt_PlayVoice
  602.  
  603.     BRA    mt_SetDMA
  604.  
  605. mt_PlayVoice
  606.     TST.L    (A6)
  607.     BNE.S    mt_plvskip
  608.     BSR    mt_PerNop
  609. mt_plvskip
  610.     MOVE.L    (A0,D1.L),(A6)
  611.     ADDQ.L    #4,D1
  612.     MOVEQ    #0,D2
  613.     MOVE.B    n_cmd(A6),D2
  614.     AND.B    #$F0,D2
  615.     LSR.B    #4,D2
  616.     MOVE.B    (A6),D0
  617.     AND.B    #$F0,D0
  618.     OR.B    D0,D2
  619.     TST.B    D2
  620.     BEQ    mt_SetRegs
  621.     MOVEQ    #0,D3
  622.     LEA    mt_SampleStarts(PC),A1
  623.     MOVE    D2,D4
  624.     SUBQ.L    #1,D2
  625.     ASL.L    #2,D2
  626.     MULU    #30,D4
  627.     MOVE.L    (A1,D2.L),n_start(A6)
  628.     MOVE.W    (A3,D4.L),n_length(A6)
  629.     MOVE.W    (A3,D4.L),n_reallength(A6)
  630.     MOVE.B    2(A3,D4.L),n_finetune(A6)
  631.     MOVE.B    3(A3,D4.L),n_volume(A6)
  632.  
  633.     ***********
  634.  
  635.     movem.l    a0-a6,-(a7)
  636.  
  637.     cmp.b    #0,n_volume(a6)
  638.     beq    no_vol
  639.  
  640.     move.l    ss,a0            ; sample start at
  641.     move.l    n_start(a6),(a0)
  642.  
  643.     move.l    sl,a0            ; sound length
  644.     move.w    n_length(a6),(a0)
  645.  
  646. no_vol:    movem.l    (a7)+,a0-a6
  647.     
  648.     ************
  649.  
  650.     MOVE.W    4(A3,D4.L),D3         ; Get repeat
  651.     TST.W    D3
  652.     BEQ.S    mt_NoLoop
  653.     MOVE.L    n_start(A6),D2        ; Get start
  654.     ASL.W    #1,D3
  655.     ADD.L    D3,D2            ; Add repeat
  656.     MOVE.L    D2,n_loopstart(A6)
  657.     MOVE.L    D2,n_wavestart(A6)
  658.     MOVE.W    4(A3,D4.L),D0        ; Get repeat
  659.     ADD.W    6(A3,D4.L),D0        ; Add replen
  660.     MOVE.W    D0,n_length(A6)
  661.     MOVE.W    6(A3,D4.L),n_replen(A6)    ; Save replen
  662.     MOVEQ    #0,D0
  663.     MOVE.B    n_volume(A6),D0
  664.     MOVE.W    D0,8(A5)    ; Set volume
  665.     BRA.S    mt_SetRegs
  666.  
  667. mt_NoLoop
  668.     MOVE.L    n_start(A6),D2
  669.     ADD.L    D3,D2
  670.     MOVE.L    D2,n_loopstart(A6)
  671.     MOVE.L    D2,n_wavestart(A6)
  672.     MOVE.W    6(A3,D4.L),n_replen(A6)    ; Save replen
  673.     MOVEQ    #0,D0
  674.     MOVE.B    n_volume(A6),D0
  675.     MOVE.W    D0,8(A5)    ; Set volume
  676. mt_SetRegs
  677.     MOVE.W    (A6),D0
  678.     AND.W    #$0FFF,D0
  679.     BEQ    mt_CheckMoreEfx        ; If no note
  680.     MOVE.W    2(A6),D0
  681.     AND.W    #$0FF0,D0
  682.     CMP.W    #$0E50,D0
  683.     BEQ.S    mt_DoSetFineTune
  684.     MOVE.B    2(A6),D0
  685.     AND.B    #$0F,D0
  686.     CMP.B    #3,D0    ; TonePortamento
  687.     BEQ.S    mt_ChkTonePorta
  688.     CMP.B    #5,D0
  689.     BEQ.S    mt_ChkTonePorta
  690.     CMP.B    #9,D0    ; Sample Offset
  691.     BNE.S    mt_SetPeriod
  692.     BSR    mt_CheckMoreEfx
  693.     BRA.S    mt_SetPeriod
  694.  
  695. mt_DoSetFineTune
  696.     BSR    mt_SetFineTune
  697.     BRA.S    mt_SetPeriod
  698.  
  699. mt_ChkTonePorta
  700.     BSR    mt_SetTonePorta
  701.     BRA    mt_CheckMoreEfx
  702.  
  703. mt_SetPeriod
  704.     MOVEM.L    D0-D1/A0-A1,-(SP)
  705.     MOVE.W    (A6),D1
  706.     AND.W    #$0FFF,D1
  707.     LEA    mt_PeriodTable(PC),A1
  708.     MOVEQ    #0,D0
  709.     MOVEQ    #36,D2
  710. mt_ftuloop
  711.     CMP.W    (A1,D0.W),D1
  712.     BHS.S    mt_ftufound
  713.     ADDQ.L    #2,D0
  714.     DBRA    D2,mt_ftuloop
  715. mt_ftufound
  716.     MOVEQ    #0,D1
  717.     MOVE.B    n_finetune(A6),D1
  718.     MULU    #36*2,D1
  719.     ADD.L    D1,A1
  720.     MOVE.W    (A1,D0.W),n_period(A6)
  721.     MOVEM.L    (SP)+,D0-D1/A0-A1
  722.  
  723.     MOVE.W    2(A6),D0
  724.     AND.W    #$0FF0,D0
  725.     CMP.W    #$0ED0,D0 ; Notedelay
  726.     BEQ    mt_CheckMoreEfx
  727.  
  728.     MOVE.W    n_dmabit(A6),$DFF096
  729.     BTST    #2,n_wavecontrol(A6)
  730.     BNE.S    mt_vibnoc
  731.     CLR.B    n_vibratopos(A6)
  732. mt_vibnoc
  733.     BTST    #6,n_wavecontrol(A6)
  734.     BNE.S    mt_trenoc
  735.     CLR.B    n_tremolopos(A6)
  736. mt_trenoc
  737.     MOVE.L    n_start(A6),(A5)        ; Set start
  738.     MOVE.W    n_length(A6),4(A5)    ; Set length
  739.     MOVE.W    n_period(A6),D0
  740.     MOVE.W    D0,6(A5)            ; Set period
  741.     MOVE.W    n_dmabit(A6),D0
  742.     OR.W    D0,mt_DMACONtemp
  743.     BRA    mt_CheckMoreEfx
  744.  
  745. mt_SetDMA
  746.     MOVE.W    #300,D0
  747. mt_WaitDMA
  748.     DBRA    D0,mt_WaitDMA
  749.     MOVE.W    mt_DMACONtemp(PC),D0
  750.     OR.W    #$8000,D0
  751.     MOVE.W    D0,$DFF096
  752.     MOVE.W    #300,D0
  753. mt_WaitDMA2
  754.     DBRA    D0,mt_WaitDMA2
  755.  
  756.     ************
  757.  
  758.     LEA    mt_chan1temp(PC),A6
  759.     move.w    n_period(a6),a5
  760.     cmp.w    showlen1,a5
  761.     ble    no_sound1
  762.     cmp.w    #160,n_replen(a6)
  763.     ble    no_sound1
  764.     cmp.b    #0,n_volume(a6)
  765.     beq    no_sound1
  766.     move.l    n_loopstart(a6),showsound1
  767.     move.w    n_replen(a6),showlen1
  768. no_sound1:
  769.  
  770.     LEA    mt_chan2temp(PC),A6
  771.     move.w    n_period(a6),a5
  772.     cmp.w    showlen2,a5
  773.     ble    no_sound2
  774.     cmp.w    #160,n_replen(a6)
  775.     ble    no_sound2
  776.     cmp.b    #0,n_volume(a6)
  777.     beq    no_sound2
  778.     move.l    n_loopstart(a6),showsound2
  779.     move.w    n_replen(a6),showlen2
  780. no_sound2:
  781.  
  782.     LEA    mt_chan3temp(PC),A6
  783.     move.w    n_period(a6),a5
  784.     cmp.w    showlen3,a5
  785.     ble    no_sound3
  786.     cmp.w    #160,n_replen(a6)
  787.     ble    no_sound3
  788.     cmp.b    #0,n_volume(a6)
  789.     beq    no_sound3
  790.     move.l    n_loopstart(a6),showsound3
  791.     move.w    n_replen(a6),showlen3
  792. no_sound3:
  793.  
  794.     LEA    mt_chan4temp(PC),A6
  795.     move.w    n_period(a6),a5
  796.     cmp.w    showlen4,a5
  797.     ble    no_sound4
  798.     cmp.w    #160,n_replen(a6)
  799.     ble    no_sound4
  800.     cmp.b    #0,n_volume(a6)
  801.     beq    no_sound4
  802.     move.l    n_loopstart(a6),showsound4
  803.     move.w    n_replen(a6),showlen4
  804. no_sound4:
  805.  
  806.     ************
  807.  
  808.     LEA    $DFF000,A5
  809.     LEA    mt_chan4temp(PC),A6
  810.     MOVE.L    n_loopstart(A6),$D0(A5)
  811.     MOVE.W    n_replen(A6),$D4(A5)
  812.     LEA    mt_chan3temp(PC),A6
  813.     MOVE.L    n_loopstart(A6),$C0(A5)
  814.     MOVE.W    n_replen(A6),$C4(A5)
  815.     LEA    mt_chan2temp(PC),A6
  816.     MOVE.L    n_loopstart(A6),$B0(A5)
  817.     MOVE.W    n_replen(A6),$B4(A5)
  818.     LEA    mt_chan1temp(PC),A6
  819.     MOVE.L    n_loopstart(A6),$A0(A5)
  820.     MOVE.W    n_replen(A6),$A4(A5)
  821.  
  822. mt_dskip
  823.     ADD.W    #16,mt_PatternPos
  824.     MOVE.B    mt_PattDelTime,D0
  825.     BEQ.S    mt_dskc
  826.     MOVE.B    D0,mt_PattDelTime2
  827.     CLR.B    mt_PattDelTime
  828. mt_dskc    TST.B    mt_PattDelTime2
  829.     BEQ.S    mt_dska
  830.     SUBQ.B    #1,mt_PattDelTime2
  831.     BEQ.S    mt_dska
  832.     SUB.W    #16,mt_PatternPos
  833. mt_dska    TST.B    mt_PBreakFlag
  834.     BEQ.S    mt_nnpysk
  835.     SF    mt_PBreakFlag
  836.     MOVEQ    #0,D0
  837.     MOVE.B    mt_PBreakPos(PC),D0
  838.     CLR.B    mt_PBreakPos
  839.     LSL.W    #4,D0
  840.     MOVE.W    D0,mt_PatternPos
  841. mt_nnpysk
  842.     CMP.W    #1024,mt_PatternPos
  843.     BLO.S    mt_NoNewPosYet
  844. mt_NextPosition    
  845.     MOVEQ    #0,D0
  846.     MOVE.B    mt_PBreakPos(PC),D0
  847.     LSL.W    #4,D0
  848.     MOVE.W    D0,mt_PatternPos
  849.     CLR.B    mt_PBreakPos
  850.     CLR.B    mt_PosJumpFlag
  851.     ADDQ.B    #1,mt_SongPos
  852.     AND.B    #$7F,mt_SongPos
  853.     MOVE.B    mt_SongPos(PC),D1
  854.     MOVE.L    mt_SongDataPtr(PC),A0
  855.     CMP.B    950(A0),D1
  856.     BLO.S    mt_NoNewPosYet
  857.     CLR.B    mt_SongPos
  858.     move.w    #-1,songended
  859. mt_NoNewPosYet    
  860.     TST.B    mt_PosJumpFlag
  861.     BNE.S    mt_NextPosition
  862. mt_exit    MOVEM.L    (SP)+,D0-D4/A0-A6
  863.     RTS
  864.  
  865. mt_CheckEfx
  866.     movem.l    d0-d7/a0-a6,-(a7)
  867.  
  868.     ********* my equ routines *********
  869.  
  870.     LEA    mt_chan1temp(PC),A6
  871.     cmp.w    #0,n_cmd(A6)
  872.     beq    no_restart_1a
  873.     cmp.w    #0,showlen1
  874.     bgt.s    no_restart_1a
  875.     cmp.w    #100,n_length(a6)
  876.     blt.s    no_restart_1a    
  877.     move.l    n_loopstart(a6),showsound1
  878.     move.w    n_replen(a6),showlen1
  879.         
  880. no_restart_1a:
  881.     LEA    mt_chan2temp(PC),A6
  882.     cmp.w    #0,n_cmd(A6)
  883.     beq    no_restart_2a
  884.     cmp.w    #0,showlen2
  885.     bgt.s    no_restart_2a
  886.     cmp.w    #100,n_length(a6)
  887.     blt.s    no_restart_2a
  888.     move.l    n_loopstart(a6),showsound2
  889.     move.w    n_replen(a6),showlen2
  890. no_restart_2a:
  891.     LEA    mt_chan3temp(PC),A6
  892.     cmp.w    #0,n_cmd(A6)
  893.     beq    no_restart_3a
  894.     cmp.w    #0,showlen3
  895.     bgt.s    no_restart_3a
  896.     cmp.w    #100,n_length(a6)
  897.     blt.s    no_restart_3a    
  898.     move.l    n_loopstart(a6),showsound3
  899.     move.w    n_replen(a6),showlen3
  900. no_restart_3a:
  901.     LEA    mt_chan4temp(PC),A6
  902.     cmp.w    #0,n_cmd(A6)
  903.     beq    no_restart_4a
  904.     cmp.w    #0,showlen4
  905.     bgt.s    no_restart_4a
  906.     cmp.w    #100,n_length(a6)
  907.     blt.s    no_restart_4a    
  908.     move.l    n_loopstart(a6),showsound4
  909.     move.w    n_replen(a6),showlen4
  910. no_restart_4a:
  911.  
  912.     ************************************
  913.  
  914.     movem.l    (a7)+,d0-d7/a0-a6
  915.  
  916.     BSR    mt_UpdateFunk
  917.     MOVE.W    n_cmd(A6),D0
  918.     AND.W    #$0FFF,D0
  919.     BEQ.S    mt_PerNop
  920.     MOVE.B    n_cmd(A6),D0
  921.     AND.B    #$0F,D0
  922.     BEQ.S    mt_Arpeggio
  923.     CMP.B    #1,D0
  924.     BEQ    mt_PortaUp
  925.     CMP.B    #2,D0
  926.     BEQ    mt_PortaDown
  927.     CMP.B    #3,D0
  928.     BEQ    mt_TonePortamento
  929.     CMP.B    #4,D0
  930.     BEQ    mt_Vibrato
  931.     CMP.B    #5,D0
  932.     BEQ    mt_TonePlusVolSlide
  933.     CMP.B    #6,D0
  934.     BEQ    mt_VibratoPlusVolSlide
  935.     CMP.B    #$E,D0
  936.     BEQ    mt_E_Commands
  937. SetBack    MOVE.W    n_period(A6),6(A5)
  938.     CMP.B    #7,D0
  939.     BEQ    mt_Tremolo
  940.     CMP.B    #$A,D0
  941.     BEQ    mt_VolumeSlide
  942. mt_Return
  943.     RTS
  944.  
  945. mt_PerNop
  946.     MOVE.W    n_period(A6),6(A5)
  947.     RTS
  948.  
  949. mt_Arpeggio
  950.     MOVEQ    #0,D0
  951.     MOVE.B    mt_counter(PC),D0
  952.     DIVS    #3,D0
  953.     SWAP    D0
  954.     CMP.W    #0,D0
  955.     BEQ.S    mt_Arpeggio2
  956.     CMP.W    #2,D0
  957.     BEQ.S    mt_Arpeggio1
  958.     MOVEQ    #0,D0
  959.     MOVE.B    n_cmdlo(A6),D0
  960.     LSR.B    #4,D0
  961.     BRA.S    mt_Arpeggio3
  962.  
  963. mt_Arpeggio1
  964.     MOVEQ    #0,D0
  965.     MOVE.B    n_cmdlo(A6),D0
  966.     AND.B    #15,D0
  967.     BRA.S    mt_Arpeggio3
  968.  
  969. mt_Arpeggio2
  970.     MOVE.W    n_period(A6),D2
  971.     BRA.S    mt_Arpeggio4
  972.  
  973. mt_Arpeggio3
  974.     ASL.W    #1,D0
  975.     MOVEQ    #0,D1
  976.     MOVE.B    n_finetune(A6),D1
  977.     MULU    #36*2,D1
  978.     LEA    mt_PeriodTable(PC),A0
  979.     ADD.L    D1,A0
  980.     MOVEQ    #0,D1
  981.     MOVE.W    n_period(A6),D1
  982.     MOVEQ    #36,D3
  983. mt_arploop
  984.     MOVE.W    (A0,D0.W),D2
  985.     CMP.W    (A0),D1
  986.     BHS.S    mt_Arpeggio4
  987.     ADDQ.L    #2,A0
  988.     DBRA    D3,mt_arploop
  989.     RTS
  990.  
  991. mt_Arpeggio4
  992.     MOVE.W    D2,6(A5)
  993.     RTS
  994.  
  995. mt_FinePortaUp
  996.     TST.B    mt_counter
  997.     BNE.S    mt_Return
  998.     MOVE.B    #$0F,mt_LowMask
  999. mt_PortaUp
  1000.     MOVEQ    #0,D0
  1001.     MOVE.B    n_cmdlo(A6),D0
  1002.     AND.B    mt_LowMask(PC),D0
  1003.     MOVE.B    #$FF,mt_LowMask
  1004.     SUB.W    D0,n_period(A6)
  1005.     MOVE.W    n_period(A6),D0
  1006.     AND.W    #$0FFF,D0
  1007.     CMP.W    #113,D0
  1008.     BPL.S    mt_PortaUskip
  1009.     AND.W    #$F000,n_period(A6)
  1010.     OR.W    #113,n_period(A6)
  1011. mt_PortaUskip
  1012.     MOVE.W    n_period(A6),D0
  1013.     AND.W    #$0FFF,D0
  1014.     MOVE.W    D0,6(A5)
  1015.     RTS    
  1016.  
  1017. mt_FinePortaDown
  1018.     TST.B    mt_counter
  1019.     BNE    mt_Return
  1020.     MOVE.B    #$0F,mt_LowMask
  1021. mt_PortaDown
  1022.     CLR.W    D0
  1023.     MOVE.B    n_cmdlo(A6),D0
  1024.     AND.B    mt_LowMask(PC),D0
  1025.     MOVE.B    #$FF,mt_LowMask
  1026.     ADD.W    D0,n_period(A6)
  1027.     MOVE.W    n_period(A6),D0
  1028.     AND.W    #$0FFF,D0
  1029.     CMP.W    #856,D0
  1030.     BMI.S    mt_PortaDskip
  1031.     AND.W    #$F000,n_period(A6)
  1032.     OR.W    #856,n_period(A6)
  1033. mt_PortaDskip
  1034.     MOVE.W    n_period(A6),D0
  1035.     AND.W    #$0FFF,D0
  1036.     MOVE.W    D0,6(A5)
  1037.     RTS
  1038.  
  1039. mt_SetTonePorta
  1040.     MOVE.L    A0,-(SP)
  1041.     MOVE.W    (A6),D2
  1042.     AND.W    #$0FFF,D2
  1043.     MOVEQ    #0,D0
  1044.     MOVE.B    n_finetune(A6),D0
  1045.     MULU    #37*2,D0
  1046.     LEA    mt_PeriodTable(PC),A0
  1047.     ADD.L    D0,A0
  1048.     MOVEQ    #0,D0
  1049. mt_StpLoop
  1050.     CMP.W    (A0,D0.W),D2
  1051.     BHS.S    mt_StpFound
  1052.     ADDQ.W    #2,D0
  1053.     CMP.W    #37*2,D0
  1054.     BLO.S    mt_StpLoop
  1055.     MOVEQ    #35*2,D0
  1056. mt_StpFound
  1057.     MOVE.B    n_finetune(A6),D2
  1058.     AND.B    #8,D2
  1059.     BEQ.S    mt_StpGoss
  1060.     TST.W    D0
  1061.     BEQ.S    mt_StpGoss
  1062.     SUBQ.W    #2,D0
  1063. mt_StpGoss
  1064.     MOVE.W    (A0,D0.W),D2
  1065.     MOVE.L    (SP)+,A0
  1066.     MOVE.W    D2,n_wantedperiod(A6)
  1067.     MOVE.W    n_period(A6),D0
  1068.     CLR.B    n_toneportdirec(A6)
  1069.     CMP.W    D0,D2
  1070.     BEQ.S    mt_ClearTonePorta
  1071.     BGE    mt_Return
  1072.     MOVE.B    #1,n_toneportdirec(A6)
  1073.     RTS
  1074.  
  1075. mt_ClearTonePorta
  1076.     CLR.W    n_wantedperiod(A6)
  1077.     RTS
  1078.  
  1079. mt_TonePortamento
  1080.     MOVE.B    n_cmdlo(A6),D0
  1081.     BEQ.S    mt_TonePortNoChange
  1082.     MOVE.B    D0,n_toneportspeed(A6)
  1083.     CLR.B    n_cmdlo(A6)
  1084. mt_TonePortNoChange
  1085.     TST.W    n_wantedperiod(A6)
  1086.     BEQ    mt_Return
  1087.     MOVEQ    #0,D0
  1088.     MOVE.B    n_toneportspeed(A6),D0
  1089.     TST.B    n_toneportdirec(A6)
  1090.     BNE.S    mt_TonePortaUp
  1091. mt_TonePortaDown
  1092.     ADD.W    D0,n_period(A6)
  1093.     MOVE.W    n_wantedperiod(A6),D0
  1094.     CMP.W    n_period(A6),D0
  1095.     BGT.S    mt_TonePortaSetPer
  1096.     MOVE.W    n_wantedperiod(A6),n_period(A6)
  1097.     CLR.W    n_wantedperiod(A6)
  1098.     BRA.S    mt_TonePortaSetPer
  1099.  
  1100. mt_TonePortaUp
  1101.     SUB.W    D0,n_period(A6)
  1102.     MOVE.W    n_wantedperiod(A6),D0
  1103.     CMP.W    n_period(A6),D0
  1104.     BLT.S    mt_TonePortaSetPer
  1105.     MOVE.W    n_wantedperiod(A6),n_period(A6)
  1106.     CLR.W    n_wantedperiod(A6)
  1107.  
  1108. mt_TonePortaSetPer
  1109.     MOVE.W    n_period(A6),D2
  1110.     MOVE.B    n_glissfunk(A6),D0
  1111.     AND.B    #$0F,D0
  1112.     BEQ.S    mt_GlissSkip
  1113.     MOVEQ    #0,D0
  1114.     MOVE.B    n_finetune(A6),D0
  1115.     MULU    #36*2,D0
  1116.     LEA    mt_PeriodTable(PC),A0
  1117.     ADD.L    D0,A0
  1118.     MOVEQ    #0,D0
  1119. mt_GlissLoop
  1120.     CMP.W    (A0,D0.W),D2
  1121.     BHS.S    mt_GlissFound
  1122.     ADDQ.W    #2,D0
  1123.     CMP.W    #36*2,D0
  1124.     BLO.S    mt_GlissLoop
  1125.     MOVEQ    #35*2,D0
  1126. mt_GlissFound
  1127.     MOVE.W    (A0,D0.W),D2
  1128. mt_GlissSkip
  1129.     MOVE.W    D2,6(A5) ; Set period
  1130.     RTS
  1131.  
  1132. mt_Vibrato
  1133.     MOVE.B    n_cmdlo(A6),D0
  1134.     BEQ.S    mt_Vibrato2
  1135.     MOVE.B    n_vibratocmd(A6),D2
  1136.     AND.B    #$0F,D0
  1137.     BEQ.S    mt_vibskip
  1138.     AND.B    #$F0,D2
  1139.     OR.B    D0,D2
  1140. mt_vibskip
  1141.     MOVE.B    n_cmdlo(A6),D0
  1142.     AND.B    #$F0,D0
  1143.     BEQ.S    mt_vibskip2
  1144.     AND.B    #$0F,D2
  1145.     OR.B    D0,D2
  1146. mt_vibskip2
  1147.     MOVE.B    D2,n_vibratocmd(A6)
  1148. mt_Vibrato2
  1149.     MOVE.B    n_vibratopos(A6),D0
  1150.     LEA    mt_VibratoTable(PC),A4
  1151.     LSR.W    #2,D0
  1152.     AND.W    #$001F,D0
  1153.     MOVEQ    #0,D2
  1154.     MOVE.B    n_wavecontrol(A6),D2
  1155.     AND.B    #$03,D2
  1156.     BEQ.S    mt_vib_sine
  1157.     LSL.B    #3,D0
  1158.     CMP.B    #1,D2
  1159.     BEQ.S    mt_vib_rampdown
  1160.     MOVE.B    #255,D2
  1161.     BRA.S    mt_vib_set
  1162. mt_vib_rampdown
  1163.     TST.B    n_vibratopos(A6)
  1164.     BPL.S    mt_vib_rampdown2
  1165.     MOVE.B    #255,D2
  1166.     SUB.B    D0,D2
  1167.     BRA.S    mt_vib_set
  1168. mt_vib_rampdown2
  1169.     MOVE.B    D0,D2
  1170.     BRA.S    mt_vib_set
  1171. mt_vib_sine
  1172.     MOVE.B    (A4,D0.W),D2
  1173. mt_vib_set
  1174.     MOVE.B    n_vibratocmd(A6),D0
  1175.     AND.W    #15,D0
  1176.     MULU    D0,D2
  1177.     LSR.W    #7,D2
  1178.     MOVE.W    n_period(A6),D0
  1179.     TST.B    n_vibratopos(A6)
  1180.     BMI.S    mt_VibratoNeg
  1181.     ADD.W    D2,D0
  1182.     BRA.S    mt_Vibrato3
  1183. mt_VibratoNeg
  1184.     SUB.W    D2,D0
  1185. mt_Vibrato3
  1186.     MOVE.W    D0,6(A5)
  1187.     MOVE.B    n_vibratocmd(A6),D0
  1188.     LSR.W    #2,D0
  1189.     AND.W    #$003C,D0
  1190.     ADD.B    D0,n_vibratopos(A6)
  1191.     RTS
  1192.  
  1193. mt_TonePlusVolSlide
  1194.     BSR    mt_TonePortNoChange
  1195.     BRA    mt_VolumeSlide
  1196.  
  1197. mt_VibratoPlusVolSlide
  1198.     BSR.S    mt_Vibrato2
  1199.     BRA    mt_VolumeSlide
  1200.  
  1201. mt_Tremolo
  1202.     MOVE.B    n_cmdlo(A6),D0
  1203.     BEQ.S    mt_Tremolo2
  1204.     MOVE.B    n_tremolocmd(A6),D2
  1205.     AND.B    #$0F,D0
  1206.     BEQ.S    mt_treskip
  1207.     AND.B    #$F0,D2
  1208.     OR.B    D0,D2
  1209. mt_treskip
  1210.     MOVE.B    n_cmdlo(A6),D0
  1211.     AND.B    #$F0,D0
  1212.     BEQ.S    mt_treskip2
  1213.     AND.B    #$0F,D2
  1214.     OR.B    D0,D2
  1215. mt_treskip2
  1216.     MOVE.B    D2,n_tremolocmd(A6)
  1217. mt_Tremolo2
  1218.     MOVE.B    n_tremolopos(A6),D0
  1219.     LEA    mt_VibratoTable(PC),A4
  1220.     LSR.W    #2,D0
  1221.     AND.W    #$001F,D0
  1222.     MOVEQ    #0,D2
  1223.     MOVE.B    n_wavecontrol(A6),D2
  1224.     LSR.B    #4,D2
  1225.     AND.B    #$03,D2
  1226.     BEQ.S    mt_tre_sine
  1227.     LSL.B    #3,D0
  1228.     CMP.B    #1,D2
  1229.     BEQ.S    mt_tre_rampdown
  1230.     MOVE.B    #255,D2
  1231.     BRA.S    mt_tre_set
  1232. mt_tre_rampdown
  1233.     TST.B    n_vibratopos(A6)
  1234.     BPL.S    mt_tre_rampdown2
  1235.     MOVE.B    #255,D2
  1236.     SUB.B    D0,D2
  1237.     BRA.S    mt_tre_set
  1238. mt_tre_rampdown2
  1239.     MOVE.B    D0,D2
  1240.     BRA.S    mt_tre_set
  1241. mt_tre_sine
  1242.     MOVE.B    (A4,D0.W),D2
  1243. mt_tre_set
  1244.     MOVE.B    n_tremolocmd(A6),D0
  1245.     AND.W    #15,D0
  1246.     MULU    D0,D2
  1247.     LSR.W    #6,D2
  1248.     MOVEQ    #0,D0
  1249.     MOVE.B    n_volume(A6),D0
  1250.     TST.B    n_tremolopos(A6)
  1251.     BMI.S    mt_TremoloNeg
  1252.     ADD.W    D2,D0
  1253.     BRA.S    mt_Tremolo3
  1254. mt_TremoloNeg
  1255.     SUB.W    D2,D0
  1256. mt_Tremolo3
  1257.     BPL.S    mt_TremoloSkip
  1258.     CLR.W    D0
  1259. mt_TremoloSkip
  1260.     CMP.W    #$40,D0
  1261.     BLS.S    mt_TremoloOk
  1262.     MOVE.W    #$40,D0
  1263. mt_TremoloOk
  1264.     MOVE.W    D0,8(A5)
  1265.     MOVE.B    n_tremolocmd(A6),D0
  1266.     LSR.W    #2,D0
  1267.     AND.W    #$003C,D0
  1268.     ADD.B    D0,n_tremolopos(A6)
  1269.     RTS
  1270.  
  1271. mt_SampleOffset
  1272.     MOVEQ    #0,D0
  1273.     MOVE.B    n_cmdlo(A6),D0
  1274.     BEQ.S    mt_sononew
  1275.     MOVE.B    D0,n_sampleoffset(A6)
  1276. mt_sononew
  1277.     MOVE.B    n_sampleoffset(A6),D0
  1278.     LSL.W    #7,D0
  1279.     CMP.W    n_length(A6),D0
  1280.     BGE.S    mt_sofskip
  1281.     SUB.W    D0,n_length(A6)
  1282.     LSL.W    #1,D0
  1283.     ADD.L    D0,n_start(A6)
  1284.     RTS
  1285. mt_sofskip
  1286.     MOVE.W    #$0001,n_length(A6)
  1287.     RTS
  1288.  
  1289. mt_VolumeSlide
  1290.     MOVEQ    #0,D0
  1291.     MOVE.B    n_cmdlo(A6),D0
  1292.     LSR.B    #4,D0
  1293.     TST.B    D0
  1294.     BEQ.S    mt_VolSlideDown
  1295. mt_VolSlideUp
  1296.     ADD.B    D0,n_volume(A6)
  1297.     CMP.B    #$40,n_volume(A6)
  1298.     BMI.S    mt_vsuskip
  1299.     MOVE.B    #$40,n_volume(A6)
  1300. mt_vsuskip
  1301.     MOVE.B    n_volume(A6),D0
  1302.     MOVE.W    D0,8(A5)
  1303.     RTS
  1304.  
  1305. mt_VolSlideDown
  1306.     MOVEQ    #0,D0
  1307.     MOVE.B    n_cmdlo(A6),D0
  1308.     AND.B    #$0F,D0
  1309. mt_VolSlideDown2
  1310.     SUB.B    D0,n_volume(A6)
  1311.     BPL.S    mt_vsdskip
  1312.     CLR.B    n_volume(A6)
  1313. mt_vsdskip
  1314.     MOVE.B    n_volume(A6),D0
  1315.     MOVE.W    D0,8(A5)
  1316.     RTS
  1317.  
  1318. mt_PositionJump
  1319.     MOVE.B    n_cmdlo(A6),D0
  1320.     SUBQ.B    #1,D0
  1321.     MOVE.B    D0,mt_SongPos
  1322. mt_pj2    CLR.B    mt_PBreakPos
  1323.     ST     mt_PosJumpFlag
  1324.     RTS
  1325.  
  1326. mt_VolumeChange
  1327.     MOVEQ    #0,D0
  1328.     MOVE.B    n_cmdlo(A6),D0
  1329.     CMP.B    #$40,D0
  1330.     BLS.S    mt_VolumeOk
  1331.     MOVEQ    #$40,D0
  1332. mt_VolumeOk
  1333.     MOVE.B    D0,n_volume(A6)
  1334.     MOVE.W    D0,8(A5)
  1335.     RTS
  1336.  
  1337. mt_PatternBreak
  1338.     MOVEQ    #0,D0
  1339.     MOVE.B    n_cmdlo(A6),D0
  1340.     MOVE.L    D0,D2
  1341.     LSR.B    #4,D0
  1342.     MULU    #10,D0
  1343.     AND.B    #$0F,D2
  1344.     ADD.B    D2,D0
  1345.     CMP.B    #63,D0
  1346.     BHI.S    mt_pj2
  1347.     MOVE.B    D0,mt_PBreakPos
  1348.     ST    mt_PosJumpFlag
  1349.     RTS
  1350.  
  1351. mt_SetSpeed
  1352.     MOVEQ    #0,D0
  1353.     MOVE.B    3(A6),D0
  1354.     BEQ    mt_end
  1355.     CMP.B    #32,D0
  1356.     BHS    SetTempo
  1357.     CLR.B    mt_counter
  1358.     MOVE.B    D0,mt_speed
  1359.     RTS
  1360.  
  1361. SetTempo:
  1362.     CMP.W    #32,D0
  1363.     BHS.S    setemsk
  1364.     MOVEQ    #32,D0
  1365. setemsk    MOVE.W    D0,RealTempo
  1366.     MOVE.L    TimerValue(PC),D2
  1367.     DIVU    D0,D2
  1368.     move.w    d2,ciatime
  1369.     
  1370.     RTS
  1371.  
  1372. mt_CheckMoreEfx
  1373.     BSR    mt_UpdateFunk
  1374.     MOVE.B    2(A6),D0
  1375.     AND.B    #$0F,D0
  1376.     CMP.B    #$9,D0
  1377.     BEQ    mt_SampleOffset
  1378.     CMP.B    #$B,D0
  1379.     BEQ    mt_PositionJump
  1380.     CMP.B    #$D,D0
  1381.     BEQ    mt_PatternBreak
  1382.     CMP.B    #$E,D0
  1383.     BEQ.S    mt_E_Commands
  1384.     CMP.B    #$F,D0
  1385.     BEQ    mt_SetSpeed
  1386.     CMP.B    #$C,D0
  1387.     BEQ    mt_VolumeChange
  1388.     BRA    mt_PerNop
  1389.  
  1390. mt_E_Commands
  1391.     MOVE.B    n_cmdlo(A6),D0
  1392.     AND.B    #$F0,D0
  1393.     LSR.B    #4,D0
  1394.     BEQ.S    mt_FilterOnOff
  1395.     CMP.B    #1,D0
  1396.     BEQ    mt_FinePortaUp
  1397.     CMP.B    #2,D0
  1398.     BEQ    mt_FinePortaDown
  1399.     CMP.B    #3,D0
  1400.     BEQ.S    mt_SetGlissControl
  1401.     CMP.B    #4,D0
  1402.     BEQ    mt_SetVibratoControl
  1403.     CMP.B    #5,D0
  1404.     BEQ    mt_SetFineTune
  1405.     CMP.B    #6,D0
  1406.     BEQ    mt_JumpLoop
  1407.     CMP.B    #7,D0
  1408.     BEQ    mt_SetTremoloControl
  1409.     CMP.B    #9,D0
  1410.     BEQ    mt_RetrigNote
  1411.     CMP.B    #$A,D0
  1412.     BEQ    mt_VolumeFineUp
  1413.     CMP.B    #$B,D0
  1414.     BEQ    mt_VolumeFineDown
  1415.     CMP.B    #$C,D0
  1416.     BEQ    mt_NoteCut
  1417.     CMP.B    #$D,D0
  1418.     BEQ    mt_NoteDelay
  1419.     CMP.B    #$E,D0
  1420.     BEQ    mt_PatternDelay
  1421.     CMP.B    #$F,D0
  1422.     BEQ    mt_FunkIt
  1423.     RTS
  1424.  
  1425. mt_FilterOnOff
  1426.     MOVE.B    n_cmdlo(A6),D0
  1427.     AND.B    #1,D0
  1428.     ASL.B    #1,D0
  1429.     AND.B    #$FD,$BFE001
  1430.     OR.B    D0,$BFE001
  1431.     RTS    
  1432.  
  1433. mt_SetGlissControl
  1434.     MOVE.B    n_cmdlo(A6),D0
  1435.     AND.B    #$0F,D0
  1436.     AND.B    #$F0,n_glissfunk(A6)
  1437.     OR.B    D0,n_glissfunk(A6)
  1438.     RTS
  1439.  
  1440. mt_SetVibratoControl
  1441.     MOVE.B    n_cmdlo(A6),D0
  1442.     AND.B    #$0F,D0
  1443.     AND.B    #$F0,n_wavecontrol(A6)
  1444.     OR.B    D0,n_wavecontrol(A6)
  1445.     RTS
  1446.  
  1447. mt_SetFineTune
  1448.     MOVE.B    n_cmdlo(A6),D0
  1449.     AND.B    #$0F,D0
  1450.     MOVE.B    D0,n_finetune(A6)
  1451.     RTS
  1452.  
  1453. mt_JumpLoop
  1454.     TST.B    mt_counter
  1455.     BNE    mt_Return
  1456.     MOVE.B    n_cmdlo(A6),D0
  1457.     AND.B    #$0F,D0
  1458.     BEQ.S    mt_SetLoop
  1459.     TST.B    n_loopcount(A6)
  1460.     BEQ.S    mt_jumpcnt
  1461.     SUBQ.B    #1,n_loopcount(A6)
  1462.     BEQ    mt_Return
  1463. mt_jmploop    MOVE.B    n_pattpos(A6),mt_PBreakPos
  1464.     ST    mt_PBreakFlag
  1465.     RTS
  1466.  
  1467. mt_jumpcnt
  1468.     MOVE.B    D0,n_loopcount(A6)
  1469.     BRA.S    mt_jmploop
  1470.  
  1471. mt_SetLoop
  1472.     MOVE.W    mt_PatternPos(PC),D0
  1473.     LSR.W    #4,D0
  1474.     MOVE.B    D0,n_pattpos(A6)
  1475.     RTS
  1476.  
  1477. mt_SetTremoloControl
  1478.     MOVE.B    n_cmdlo(A6),D0
  1479.     AND.B    #$0F,D0
  1480.     LSL.B    #4,D0
  1481.     AND.B    #$0F,n_wavecontrol(A6)
  1482.     OR.B    D0,n_wavecontrol(A6)
  1483.     RTS
  1484.  
  1485. mt_RetrigNote
  1486.     MOVE.L    D1,-(SP)
  1487.     MOVEQ    #0,D0
  1488.     MOVE.B    n_cmdlo(A6),D0
  1489.     AND.B    #$0F,D0
  1490.     BEQ.S    mt_rtnend
  1491.     MOVEQ    #0,D1
  1492.     MOVE.B    mt_counter(PC),D1
  1493.     BNE.S    mt_rtnskp
  1494.     MOVE.W    (A6),D1
  1495.     AND.W    #$0FFF,D1
  1496.     BNE.S    mt_rtnend
  1497.     MOVEQ    #0,D1
  1498.     MOVE.B    mt_counter(PC),D1
  1499. mt_rtnskp
  1500.     DIVU    D0,D1
  1501.     SWAP    D1
  1502.     TST.W    D1
  1503.     BNE.S    mt_rtnend
  1504. mt_DoRetrig
  1505.     MOVE.W    n_dmabit(A6),$DFF096    ; Channel DMA off
  1506.     MOVE.L    n_start(A6),(A5)    ; Set sampledata pointer
  1507.     MOVE.W    n_length(A6),4(A5)    ; Set length
  1508.     MOVE.W    #300,D0
  1509. mt_rtnloop1
  1510.     DBRA    D0,mt_rtnloop1
  1511.     MOVE.W    n_dmabit(A6),D0
  1512.     BSET    #15,D0
  1513.     MOVE.W    D0,$DFF096
  1514.     MOVE.W    #300,D0
  1515. mt_rtnloop2
  1516.     DBRA    D0,mt_rtnloop2
  1517.     MOVE.L    n_loopstart(A6),(A5)
  1518.     MOVE.L    n_replen(A6),4(A5)
  1519. mt_rtnend
  1520.     MOVE.L    (SP)+,D1
  1521.     RTS
  1522.  
  1523. mt_VolumeFineUp
  1524.     TST.B    mt_counter
  1525.     BNE    mt_Return
  1526.     MOVEQ    #0,D0
  1527.     MOVE.B    n_cmdlo(A6),D0
  1528.     AND.B    #$F,D0
  1529.     BRA    mt_VolSlideUp
  1530.  
  1531. mt_VolumeFineDown
  1532.     TST.B    mt_counter
  1533.     BNE    mt_Return
  1534.     MOVEQ    #0,D0
  1535.     MOVE.B    n_cmdlo(A6),D0
  1536.     AND.B    #$0F,D0
  1537.     BRA    mt_VolSlideDown2
  1538.  
  1539. mt_NoteCut
  1540.     MOVEQ    #0,D0
  1541.     MOVE.B    n_cmdlo(A6),D0
  1542.     AND.B    #$0F,D0
  1543.     CMP.B    mt_counter(PC),D0
  1544.     BNE    mt_Return
  1545.     CLR.B    n_volume(A6)
  1546.     MOVE.W    #0,8(A5)
  1547.     RTS
  1548.  
  1549. mt_NoteDelay
  1550.     MOVEQ    #0,D0
  1551.     MOVE.B    n_cmdlo(A6),D0
  1552.     AND.B    #$0F,D0
  1553.     CMP.B    mt_Counter,D0
  1554.     BNE    mt_Return
  1555.     MOVE.W    (A6),D0
  1556.     BEQ    mt_Return
  1557.     MOVE.L    D1,-(SP)
  1558.     BRA    mt_DoRetrig
  1559.  
  1560. mt_PatternDelay
  1561.     TST.B    mt_counter
  1562.     BNE    mt_Return
  1563.     MOVEQ    #0,D0
  1564.     MOVE.B    n_cmdlo(A6),D0
  1565.     AND.B    #$0F,D0
  1566.     TST.B    mt_PattDelTime2
  1567.     BNE    mt_Return
  1568.     ADDQ.B    #1,D0
  1569.     MOVE.B    D0,mt_PattDelTime
  1570.     RTS
  1571.  
  1572. mt_FunkIt
  1573.     TST.B    mt_counter
  1574.     BNE    mt_Return
  1575.     MOVE.B    n_cmdlo(A6),D0
  1576.     AND.B    #$0F,D0
  1577.     LSL.B    #4,D0
  1578.     AND.B    #$0F,n_glissfunk(A6)
  1579.     OR.B    D0,n_glissfunk(A6)
  1580.     TST.B    D0
  1581.     BEQ    mt_Return
  1582. mt_UpdateFunk
  1583.     MOVEM.L    A0/D1,-(SP)
  1584.     MOVEQ    #0,D0
  1585.     MOVE.B    n_glissfunk(A6),D0
  1586.     LSR.B    #4,D0
  1587.     BEQ.S    mt_funkend
  1588.     LEA    mt_FunkTable(PC),A0
  1589.     MOVE.B    (A0,D0.W),D0
  1590.     ADD.B    D0,n_funkoffset(A6)
  1591.     BTST    #7,n_funkoffset(A6)
  1592.     BEQ.S    mt_funkend
  1593.     CLR.B    n_funkoffset(A6)
  1594.  
  1595.     MOVE.L    n_loopstart(A6),D0
  1596.     MOVEQ    #0,D1
  1597.     MOVE.W    n_replen(A6),D1
  1598.     ADD.L    D1,D0
  1599.     ADD.L    D1,D0
  1600.     MOVE.L    n_wavestart(A6),A0
  1601.     ADDQ.L    #1,A0
  1602.     CMP.L    D0,A0
  1603.     BLO.S    mt_funkok
  1604.     MOVE.L    n_loopstart(A6),A0
  1605. mt_funkok
  1606.     MOVE.L    A0,n_wavestart(A6)
  1607.     MOVEQ    #-1,D0
  1608.     SUB.B    (A0),D0
  1609.     MOVE.B    D0,(A0)
  1610. mt_funkend
  1611.     MOVEM.L    (SP)+,A0/D1
  1612.     RTS
  1613.  
  1614.  
  1615. mt_FunkTable dc.b 0,5,6,7,8,10,11,13,16,19,22,26,32,43,64,128
  1616.  
  1617. mt_VibratoTable    
  1618.     dc.b   0, 24, 49, 74, 97,120,141,161
  1619.     dc.b 180,197,212,224,235,244,250,253
  1620.     dc.b 255,253,250,244,235,224,212,197
  1621.     dc.b 180,161,141,120, 97, 74, 49, 24
  1622.  
  1623. mt_PeriodTable
  1624. ; Tuning 0, Normal
  1625.     dc.w    856,808,762,720,678,640,604,570,538,508,480,453
  1626.     dc.w    428,404,381,360,339,320,302,285,269,254,240,226
  1627.     dc.w    214,202,190,180,170,160,151,143,135,127,120,113
  1628. ; Tuning 1
  1629.     dc.w    850,802,757,715,674,637,601,567,535,505,477,450
  1630.     dc.w    425,401,379,357,337,318,300,284,268,253,239,225
  1631.     dc.w    213,201,189,179,169,159,150,142,134,126,119,113
  1632. ; Tuning 2
  1633.     dc.w    844,796,752,709,670,632,597,563,532,502,474,447
  1634.     dc.w    422,398,376,355,335,316,298,282,266,251,237,224
  1635.     dc.w    211,199,188,177,167,158,149,141,133,125,118,112
  1636. ; Tuning 3
  1637.     dc.w    838,791,746,704,665,628,592,559,528,498,470,444
  1638.     dc.w    419,395,373,352,332,314,296,280,264,249,235,222
  1639.     dc.w    209,198,187,176,166,157,148,140,132,125,118,111
  1640. ; Tuning 4
  1641.     dc.w    832,785,741,699,660,623,588,555,524,495,467,441
  1642.     dc.w    416,392,370,350,330,312,294,278,262,247,233,220
  1643.     dc.w    208,196,185,175,165,156,147,139,131,124,117,110
  1644. ; Tuning 5
  1645.     dc.w    826,779,736,694,655,619,584,551,520,491,463,437
  1646.     dc.w    413,390,368,347,328,309,292,276,260,245,232,219
  1647.     dc.w    206,195,184,174,164,155,146,138,130,123,116,109
  1648. ; Tuning 6
  1649.     dc.w    820,774,730,689,651,614,580,547,516,487,460,434
  1650.     dc.w    410,387,365,345,325,307,290,274,258,244,230,217
  1651.     dc.w    205,193,183,172,163,154,145,137,129,122,115,109
  1652. ; Tuning 7
  1653.     dc.w    814,768,725,684,646,610,575,543,513,484,457,431
  1654.     dc.w    407,384,363,342,323,305,288,272,256,242,228,216
  1655.     dc.w    204,192,181,171,161,152,144,136,128,121,114,108
  1656. ; Tuning -8
  1657.     dc.w    907,856,808,762,720,678,640,604,570,538,508,480
  1658.     dc.w    453,428,404,381,360,339,320,302,285,269,254,240
  1659.     dc.w    226,214,202,190,180,170,160,151,143,135,127,120
  1660. ; Tuning -7
  1661.     dc.w    900,850,802,757,715,675,636,601,567,535,505,477
  1662.     dc.w    450,425,401,379,357,337,318,300,284,268,253,238
  1663.     dc.w    225,212,200,189,179,169,159,150,142,134,126,119
  1664. ; Tuning -6
  1665.     dc.w    894,844,796,752,709,670,632,597,563,532,502,474
  1666.     dc.w    447,422,398,376,355,335,316,298,282,266,251,237
  1667.     dc.w    223,211,199,188,177,167,158,149,141,133,125,118
  1668. ; Tuning -5
  1669.     dc.w    887,838,791,746,704,665,628,592,559,528,498,470
  1670.     dc.w    444,419,395,373,352,332,314,296,280,264,249,235
  1671.     dc.w    222,209,198,187,176,166,157,148,140,132,125,118
  1672. ; Tuning -4
  1673.     dc.w    881,832,785,741,699,660,623,588,555,524,494,467
  1674.     dc.w    441,416,392,370,350,330,312,294,278,262,247,233
  1675.     dc.w    220,208,196,185,175,165,156,147,139,131,123,117
  1676. ; Tuning -3
  1677.     dc.w    875,826,779,736,694,655,619,584,551,520,491,463
  1678.     dc.w    437,413,390,368,347,328,309,292,276,260,245,232
  1679.     dc.w    219,206,195,184,174,164,155,146,138,130,123,116
  1680. ; Tuning -2
  1681.     dc.w    868,820,774,730,689,651,614,580,547,516,487,460
  1682.     dc.w    434,410,387,365,345,325,307,290,274,258,244,230
  1683.     dc.w    217,205,193,183,172,163,154,145,137,129,122,115
  1684. ; Tuning -1
  1685.     dc.w    862,814,768,725,684,646,610,575,543,513,484,457
  1686.     dc.w    431,407,384,363,342,323,305,288,272,256,242,228
  1687.     dc.w    216,203,192,181,171,161,152,144,136,128,121,114
  1688.  
  1689. mt_chan1temp    dc.l    0,0,0,0,0,$00010000,0,  0,0,0,0
  1690. mt_chan2temp    dc.l    0,0,0,0,0,$00020000,0,  0,0,0,0
  1691. mt_chan3temp    dc.l    0,0,0,0,0,$00040000,0,  0,0,0,0
  1692. mt_chan4temp    dc.l    0,0,0,0,0,$00080000,0,  0,0,0,0
  1693.  
  1694. mt_SampleStarts    dc.l    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  1695.         dc.l    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  1696.  
  1697. mt_SongDataPtr    dc.l 0
  1698. mt_speed    dc.b 6
  1699. mt_counter    dc.b 0
  1700. mt_SongPos    dc.b 0
  1701. mt_PBreakPos    dc.b 0
  1702. mt_PosJumpFlag    dc.b 0
  1703. mt_PBreakFlag    dc.b 0
  1704. mt_LowMask    dc.b 0
  1705. mt_PattDelTime    dc.b 0
  1706. mt_PattDelTime2    dc.b 0
  1707. mt_Enable    dc.b 0
  1708. mt_PatternPos    dc.w 0
  1709. mt_DMACONtemp    dc.w 0
  1710. ciatime2:    dc.l    0
  1711.  
  1712. ;/* End of File */
  1713.  
  1714.  
  1715.  
  1716.  
  1717.  
  1718.     ********************************************************
  1719.  
  1720.  
  1721. ***------------------------------------------------------------------------
  1722. *** This is the ultimate Data-Decrunch-Routine
  1723. *** for Crunch-Mania V1.4
  1724. *** (c) 1991 by FRESH THRASH of CERBERUS, all rights reserved
  1725. *** You may use this piece of code as long as you don't claim that
  1726. *** you have written it. In any case the author (me) has to be
  1727. *** mentioned someplace in your proggy.
  1728. *** Note: Source- and Destinationaddresses have to be always even Addresses
  1729. ***------------------------------------------------------------------------
  1730. *** Here is the Format of the Header:
  1731. *** Type  Offset  Contents                   Function
  1732. *** LONG  0       "CrM!"                     to recongnize crunched files
  1733. *** WORD  4       Minimum Security Distance  to savely decrunch data when
  1734. ***                    Source and Dest is in the same
  1735. ***                    Memoryblock
  1736. *** LONG  6       Original Len               Datalen before packing
  1737. *** LONG  10 ($a) Crunched Len               Datalen after packing without
  1738. ***                    Header
  1739. **-----------------------------------------------------------
  1740. ** Jump here to decrunch some data without any overlap checks
  1741. ** The Regs have to loaded with:
  1742. ** a0: Adr of Source (with Header)
  1743. ** a1: Adr of Dest
  1744. **-----------------------------------------------------------
  1745. NormalDecrunch:
  1746.     movem.l    d0-d7/a0-a6,-(sp)
  1747.     cmp.l    #"CrM!",(a0)+
  1748.     bne.s    .NotCrunched
  1749.     tst.w    (a0)+            ;skip MinSecDist
  1750.     move.l    (a0)+,d1            ;OrgLen
  1751.     move.l    (a0)+,d2            ;CrLen
  1752.     move.l    a0,a2
  1753.     bsr.s    FastDecruncher
  1754. .NotCrunched:
  1755.     movem.l    (sp)+,d0-d7/a0-a6
  1756.     rts
  1757. **-------------------------------------------------------------------
  1758. ** This is the pure Decrunch-Routine
  1759. ** The Registers have to be loaded with the following values:
  1760. ** a1: Adr of Destination (normal)    ** a2: Adr of Source (packed)
  1761. ** d1: Len of Destination        ** d2: Len of Source
  1762. **-------------------------------------------------------------------
  1763. FastDecruncher:
  1764.     move.l    a1,a5            ;Decrunched Anfang (hier Ende des Decrunchens)
  1765.     add.l    d1,a1
  1766.     add.l    d2,a2
  1767.     move.w    -(a2),d0            ;Anz Bits in letztem Wort
  1768.     move.l    -(a2),d6            ;1.LW
  1769.     moveq    #16,d7            ;Anz Bits
  1770.     sub.w    d0,d7            ;Anz Bits, die rotiert werden müssen
  1771.     lsr.l    d7,d6            ;1.Bits an Anfang bringen
  1772.     move.w    d0,d7            ;Anz Bits, die noch im Wort sind
  1773.     moveq    #16,d3
  1774.     moveq    #0,d4
  1775. .DecrLoop:
  1776.     move.w    d1,bgc
  1777.  
  1778.     cmp.l    a5,a1
  1779.     ble.L    .DecrEnd            ;a1=a5: fertig (a1<a5: eigentlich Fehler)
  1780.  
  1781.     bsr.s    .BitTest
  1782.     bcc.s    .InsertSeq        ;1.Bit 0: Sequenz
  1783.     moveq    #0,d4
  1784. ** einzelne Bytes einfügen **
  1785. .InsertBytes:
  1786.     moveq    #8,d1
  1787.     bsr.w    .GetBits
  1788.     move.b    d0,-(a1)
  1789.     dbf    d4,.InsertBytes
  1790.     bra.s    .DecrLoop
  1791. *------------
  1792. .SpecialInsert:
  1793.     moveq    #14,d4
  1794.     moveq    #5,d1
  1795.     bsr.s    .BitTest
  1796.     bcs.s    .IB1
  1797.     moveq    #14,d1
  1798. .IB1:    bsr.s    .GetBits
  1799.     add.w    d0,d4
  1800.     bra.s    .InsertBytes
  1801. *------------
  1802. .InsertSeq:
  1803. ** Anzahl der gleichen Bits holen **
  1804.     bsr.s    .BitTest
  1805.     bcs.s    .AB1
  1806.     moveq    #1,d1            ;Maske: 0 (1 AB)
  1807.     moveq    #1,d4            ;normal: Summe 1
  1808.     bra.s    .ABGet
  1809. .AB1:
  1810.     bsr.s    .BitTest
  1811.     bcs.s    .AB2
  1812.     moveq    #2,d1            ;Maske: 01 (2 ABs)
  1813.     moveq    #3,d4            ;ab hier: Summe mindestens 3
  1814.     bra.s    .ABGet
  1815. .AB2:
  1816.     bsr.s    .BitTest
  1817.     bcs.s    .AB3
  1818.     moveq    #4,d1            ;Maske: 011 (4 ABs)
  1819.     moveq    #7,d4            ;hier: Summe 11
  1820.     bra.s    .ABGet
  1821. .AB3:
  1822.     moveq    #8,d1            ;Maske: 111 (8 ABs)
  1823.     moveq    #$17,d4            ;hier: Summe 11
  1824. .ABGet:
  1825.     bsr.s    .GetBits
  1826.     add.w    d0,d4            ;d0: Länge der Sequenz - 1
  1827.     cmp.w    #22,d4
  1828.     beq.s    .SpecialInsert
  1829.     blt.s    .Cont
  1830.     subq.w    #1,d4
  1831. .Cont:
  1832. ** SequenzAnbstand holen **
  1833.     bsr.s    .BitTest
  1834.     bcs.s    .DB1
  1835.     moveq    #9,d1            ;Maske: 0 (9 DBs)
  1836.     moveq    #$20,d2
  1837.     bra.s    .DBGet
  1838. .DB1:
  1839.     bsr.s    .BitTest
  1840.     bcs.s    .DB2
  1841.     moveq    #5,d1            ;Maske: 01 (5 DBs)
  1842.     moveq    #0,d2
  1843.     bra.s    .DBGet
  1844. .DB2:
  1845.     moveq    #14,d1            ;Maske: 11 (12 DBs)
  1846.     move.w    #$220,d2
  1847. .DBGet:
  1848.     bsr.s    .GetBits
  1849.     add.w    d2,d0
  1850.     lea    0(a1,d0.w),a3        ;a3 auf Anf zu kopierender Seq setzten
  1851. .InsSeqLoop:
  1852.     move.b    -(a3),-(a1)        ;Byte kopieren
  1853.     dbf    d4,.InsSeqLoop
  1854.  
  1855.     bra.w    .DecrLoop
  1856. *------------
  1857. .BitTest:
  1858.     subq.w    #1,d7
  1859.     bne.s    .BTNoLoop
  1860.     moveq    #16,d7            ;hier kein add notwendig: d7 vorher 0
  1861.     move.w    d6,d0
  1862.     lsr.l    #1,d6            ;Bit rausschieben und Flags setzen
  1863.     swap    d6            ;ror.l    #16,d6
  1864.     move.w    -(a2),d6        ;nächstes Wort holen
  1865.     swap    d6            ;rol.l    #16,d6
  1866.     lsr.w    #1,d0            ;Bit rausschieben und Flags setzen
  1867.     rts
  1868. .BTNoLoop:
  1869.     lsr.l    #1,d6            ;Bit rausschieben und Flags setzen
  1870.     rts
  1871. *----------
  1872. .GetBits:                ;d1:AnzBits->d0:Bits
  1873.     move.w    d6,d0            ;d6:Akt Wort
  1874.     lsr.l    d1,d6            ;nächste Bits nach vorne bringen
  1875.     sub.w    d1,d7            ;d7:Anz Bits, die noch im Wort sind
  1876.     bgt.s    .GBNoLoop
  1877. ;    add.w    #16,d7            ;BitCounter korrigieren
  1878.     add.w    d3,d7            ;BitCounter korrigieren
  1879.     ror.l    d7,d6            ;restliche Bits re rausschieben
  1880.     move.w    -(a2),d6        ;nächstes Wort holen
  1881.     rol.l    d7,d6            ;und zurückrotieren
  1882. .GBNoLoop:
  1883.     add.w    d1,d1            ;*2 (in Tab sind Ws)
  1884.     and.w    .AndData-2(pc,d1.w),d0    ;unerwünschte Bits rausschmeißen
  1885.     rts
  1886. *----------
  1887. .AndData:
  1888.     dc.w    %1,%11,%111,%1111,%11111,%111111,%1111111
  1889.     dc.w    %11111111,%111111111,%1111111111
  1890.     dc.w    %11111111111,%111111111111
  1891.     dc.w    %1111111111111,%11111111111111
  1892. *-----------
  1893. .DecrEnd:
  1894.     rts        ;a5: Start of decrunched Data
  1895.  
  1896.  
  1897.     ********************************************************
  1898.  
  1899. search_for_disk:
  1900.     move.l    d0,looklabel
  1901.  
  1902. sfd_loop:
  1903.     move.b    #0,drive
  1904.     move.l    #1,d7        ; check drive for ready
  1905.     trap    #load
  1906.     cmp.l    looklabel,d0
  1907.     beq    found_disk
  1908.  
  1909.     move.b    #1,drive
  1910.     move.l    #1,d7        ; check drive for ready
  1911.     trap    #load
  1912.     cmp.l    looklabel,d0
  1913.     beq    found_disk
  1914.  
  1915.     move.b    #2,drive
  1916.     move.l    #1,d7        ; check drive for ready
  1917.     trap    #load
  1918.     cmp.l    looklabel,d0
  1919.     beq    found_disk
  1920.  
  1921.     move.b    #3,drive
  1922.     move.l    #1,d7        ; check drive for ready
  1923.     trap    #load
  1924.     cmp.l    looklabel,d0
  1925.     beq    found_disk
  1926.  
  1927.     ;bsr    show_insert_pic
  1928.     
  1929.     bra    sfd_loop    
  1930.  
  1931.  
  1932. found_disk:
  1933.     clr.l    d0
  1934.     rts
  1935.  
  1936.     
  1937. get_volume_name:
  1938.     move.l    #0,label
  1939.     lea    $bfd000,a5
  1940.     move.b    #$ff,$100(a5)    ; deselect all drives
  1941.     bsr    mini_pause
  1942.     bclr    #7,$100(a5)    ; motor on
  1943.     bsr    mini_pause
  1944.     move.b    drive,d6
  1945.     add.b    #3,d6
  1946.     bclr    d6,$100(a5)    ; select drive
  1947.     bsr    mini_pause
  1948.     
  1949.     move.w    #600/headspeed,d7
  1950. .volloop
  1951.     bsr    mspause
  1952.     btst    #5,$1001(a5)    ; drive ready 
  1953.     beq    .is_ready
  1954.     dbf    d7,.volloop
  1955. .not_ready
  1956.     move.b    #$ff,$100(a5)    ; deselect all drives
  1957.     bsr    mini_pause
  1958.  
  1959.     move.b    #$ff,d0
  1960.     move.b    drive,d6
  1961.     add.b    #3,d6
  1962.     bchg    d6,d0
  1963.     move.b    d0,$100(a5)    ; select drive
  1964.     bsr    mini_pause
  1965.  
  1966.     move.b    #$ff,$100(a5)    ; deselect all drives
  1967.     bsr    mini_pause
  1968.     
  1969.     move.l    #-1,d0
  1970.     rte
  1971.  
  1972. .is_ready
  1973.     move.l    volumespace,a0    ; load address
  1974.     move.l    #$000000,d0    ; disk address (as trackdisk.device)
  1975.     move.l    #$400,d1        ; length
  1976.     move.l    #0,d7        ; mfm load
  1977.     trap    #load
  1978.     move.l    14(a0),label
  1979.     move.l    14(a0),d0
  1980.     rte
  1981.  
  1982. loadtracks:
  1983.     cmp.l    #1,d7
  1984.     beq    get_volume_name
  1985.  
  1986.     movem.l    d0-d7/a1-a6,-(sp)
  1987.  
  1988.     move.l    a0,loadaddress
  1989.     move.l    d0,diskaddress
  1990.     move.l    d1,loadlength
  1991.     
  1992.     lsr.l    #7,d1
  1993.     lsr.l    #2,d1        ; div by 512
  1994.  
  1995.     divu    #11,d1        ; number of tracks
  1996.     and.l    #$ffff,d1
  1997.     add.w    #1,d1
  1998.     cmp.l    #$2c00,loadlength
  1999.     blt    .short_load
  2000.     add.w    #1,d1
  2001. .short_load
  2002.     
  2003.     lsr.l    #7,d0        
  2004.     lsr.l    #2,d0        ; div by 512    
  2005.     divu    #11,d0
  2006.     and.l    #$ffff,d0
  2007.  
  2008.     move.w    d0,temp
  2009.     
  2010.                 ; d0=track
  2011.                 ; d1=number of tracks
  2012.         
  2013.  
  2014.     lea    workspace,a4    ; workspace
  2015.     lea    $bfd000,a5    ; base address of cia
  2016.     lea    $dff000,a6    ; base address of hardware
  2017.     move.l    #$55555555,d7    ; data mask - for mfm decoding
  2018.  
  2019.     move.b    $1f01(a5),d6
  2020.     and.b    #%11000000,d6
  2021.     or.b    #%00001000,d6
  2022.     move.b    d6,$1f01(a5)
  2023.     move.b    #%00000010,$1d01(a5)
  2024.     move.b    #(time&$ff),$1601(a5)
  2025.     move.b    #(time>>8),$1701(a5)
  2026.  
  2027.     move.w    #$98d0,d5    ; disk length
  2028.     move.w    #$4489,a1    ; disk sync
  2029.     bsr    load2
  2030.     
  2031.     clr.l    d2
  2032.     move.w    temp,d2        ; track number
  2033.     move.l    loadaddress,a0
  2034.     move.l    diskaddress,d0
  2035.     move.l    loadlength,d1
  2036.     
  2037.     mulu    #11,d2
  2038.     asl.l    #7,d2
  2039.     asl.l    #2,d2
  2040.     
  2041.     sub.l    d2,d0
  2042.     add.l    d0,a0        ; a0 = data start address
  2043.  
  2044.     movem.l    (sp)+,d0-d7/a1-a6    
  2045.     rte
  2046.  
  2047. load2:    subq.w    #1,d1
  2048.     bmi    mini_pause
  2049.     bsr    find_track
  2050.  
  2051. read_tracks
  2052.     bsr.w    readdata
  2053.  
  2054.     move.l    a4,a2
  2055.     moveq    #10,d6
  2056.  
  2057. find_sync
  2058.     cmp.w    (a2)+,a1
  2059.     bne.b    find_sync
  2060.  
  2061.     cmp.w    (a2),a1
  2062.     bne.b    double_sync
  2063.  
  2064.     add.l    #2,a2
  2065.  
  2066. double_sync
  2067.     move.l    (a2),d3
  2068.     move.l    4(a2),d4
  2069.     and.w    d7,d3
  2070.     and.w    d7,d4
  2071.     lsl.w    #1,d3
  2072.     or.w    d4,d3
  2073.     asr.w    #8,d3
  2074.     move.l    a0,a3
  2075.     lsl.w    #8,d3
  2076.     lsl.w    #1,d3
  2077.     add.w    d3,a3
  2078.     lea    $38(a2),a2
  2079.  
  2080.     moveq    #127,d2
  2081.  
  2082. decode_mfm    
  2083.     move.l    $200(a2),d3
  2084.     move.l    (a2)+,d4
  2085.     and.l    d7,d3
  2086.     and.l    d7,d4
  2087.     lsl.l    #1,d4
  2088.     or.l    d3,d4
  2089.     move.l    d4,(a3)+
  2090.     dbf    d2,decode_mfm
  2091.     dbf    d6,find_sync
  2092.  
  2093.     lea    $1600(a0),a0
  2094.     add.b    #1,d0
  2095.     bsr    mspause
  2096.     bsr.b    flip_side
  2097.     bsr    mspause
  2098.     dbf    d1,read_tracks
  2099.  
  2100. finished_blocks:
  2101.  
  2102.     move.b    #$ff,$100(a5)    ; deselect all drives
  2103.     bsr.b    mini_pause    
  2104.  
  2105.     move.b    #$ff,d0
  2106.     move.b    drive,d6
  2107.     add.b    #3,d6
  2108.     bchg    d6,d0
  2109.     move.b    d0,$100(a5)    ; select drive
  2110.     bsr    mini_pause
  2111.     
  2112.     move.b    #$ff,$100(a5)    ; deselect all drives
  2113. mini_pause:
  2114.     rts    
  2115.  
  2116. find_track
  2117.     move.b    #$ff,$100(a5)    ; deselect all drives
  2118.     bsr.b    mini_pause
  2119.     
  2120.     bclr    #7,$100(a5)    ; motor on
  2121.     bsr.b    mini_pause    
  2122.     
  2123.     move.b    drive,d6
  2124.     add.b    #3,d6
  2125.     bclr    d6,$100(a5)    ; select drive 0
  2126.     bsr.b    mini_pause
  2127.     bsr.b    drive_ready
  2128.  
  2129.     bset    #1,$100(a5)    ; direction towards outside
  2130.  
  2131.     ; look for track 0
  2132.  
  2133. track_0:
  2134.     btst    #4,$1001(a5)    ; check for track 0    
  2135.     beq.b    side0
  2136.     bsr.b    step_heads
  2137.     bra.b    track_0
  2138.  
  2139. flip_side:
  2140.     bchg    #2,$100(a5)    ; change side 
  2141.     btst    #0,d0
  2142.     bne.b    mini_pause
  2143.  
  2144. centre:    bclr    #1,$100(a5)    ; direction towards centre
  2145.  
  2146. step_heads:
  2147.     bclr    #0,$100(a5)    ; pulse step low
  2148.     bsr.b    mini_pause
  2149.     bset    #0,$100(a5)    ; pulse step high    
  2150.     bsr    mspause        ; milisecond pause
  2151.     rts
  2152.  
  2153. side0:    bset    #2,$100(a5)    ; side 0
  2154.     move.w    d0,d2
  2155.     lsr.b    #1,d2
  2156.     bcc.b    side1
  2157.  
  2158.     bclr    #2,$100(a5)    ; side 1
  2159.  
  2160. side1:    subq.b    #1,d2
  2161.     bmi    mini_pause
  2162.     
  2163. find_centre:
  2164.     bsr.b    centre
  2165.     dbf    d2,find_centre
  2166.     rts
  2167.  
  2168. drive_ready:
  2169.     btst    #5,$1001(a5)    ; drive ready 
  2170.     bne.b    drive_ready
  2171.     rts
  2172.  
  2173.  
  2174. readdata:
  2175.     move.w    #$8500,$9e(a6)    ; set bits 8,10 = disk data clock rate 1=fast 
  2176.                 ; word sync to sync ($4489)    
  2177.     move.w    a1,$7e(a6)    ; set sync to $4489
  2178.     bsr    drive_ready
  2179.  
  2180.     move.w    #$4000,$24(a6)    ; disk length (write disk to ram)
  2181.     move.l    a4,$20(a6)    ; disk pointer
  2182.     move.w    d5,$24(a6)    ; disk length($18d0 + set)
  2183.     move.w    d5,$24(a6)    ; disk length again - must be twice(!!)
  2184.  
  2185.     move.w    #2,$9c(a6)    ; int req - clear disk blk finished
  2186.  
  2187. waitblk:    move.w    $1e(a6),d2    ; irq bits read - 
  2188.     btst    #1,d2        ; disk blk finished
  2189.     beq    waitblk
  2190.     
  2191.     rts
  2192.  
  2193. mspause:
  2194.     lea    $bfd000,a5    ; base address of cia
  2195.  
  2196.     move.b    $1f01(a5),d6
  2197.     and.b    #%11000000,d6
  2198.     or.b    #%00001000,d6
  2199.     move.b    d6,$1f01(a5)
  2200.     move.b    #%00000010,$1d01(a5)
  2201.     move.b    #(time&$ff),$1601(a5)
  2202.     move.b    #(time>>8),$1701(a5)
  2203.  
  2204. busy_wait:
  2205.     btst.b    #1,$1d01(a5)
  2206.     beq    busy_wait
  2207.  
  2208.     rts
  2209.  
  2210.     ********************************************************
  2211.  
  2212. loadmodule:    
  2213.     move.l    diskptr,a6
  2214.  
  2215.     move.l    00(a6),d0
  2216.     bsr    search_for_disk
  2217.  
  2218. .reloadfile
  2219.     move.l    my_mem,a0    ; load address
  2220.     move.l    04(a6),d0    ; disk address
  2221.     move.l    08(a6),d1    ; length
  2222.     move.l    #0,d7        ; mfm load
  2223.     trap    #load
  2224.  
  2225.     movem.l    d1-d7/a0-a6,-(a7)
  2226.     
  2227.     move.l    08(a6),d1
  2228.     lsr.l    #2,d1
  2229.     sub.l    #1,d1
  2230.     move.l    #0,d0
  2231. .loop    move.l    (a0)+,d2
  2232.     eor.l    d2,d0
  2233.     sub.l    #1,d1
  2234.     bpl.s    .loop
  2235.  
  2236.     movem.l    (a7)+,d1-d7/a0-a6
  2237.  
  2238.     cmp.l    16(a6),d0    ; checksum
  2239.     bne    .reloadfile
  2240.     
  2241.  
  2242.     move.l    mt_data1,a1
  2243.     bsr    NormalDecrunch
  2244.  
  2245.     rts
  2246.  
  2247.     ********************************************************
  2248.  
  2249. show_iff:
  2250.     ;move.w    #$0200,iff_res+2
  2251.     
  2252.     move.l    iff,a0
  2253.     cmp.l    #"FORM",(a0)
  2254.     bne    not_iff
  2255.  
  2256.     move.l    iff,a0
  2257.     move.l    #"BMHD",d0
  2258.     bsr    findhunk
  2259.     cmp.l    #-1,a0
  2260.     beq    not_iff
  2261.     
  2262.     move.w    08(a0),iff_width
  2263.     move.w    10(a0),iff_height
  2264.     move.b    16(a0),iff_depth
  2265.     move.b    18(a0),iff_compression
  2266.  
  2267.     move.w    iff_width,d0
  2268.     lsr.w    #3,d0
  2269.     move.w    iff_height,d1
  2270.     mulu    d0,d1
  2271.     move.l    d1,iff_bmpsize
  2272.     move.b    iff_depth,d0
  2273.     mulu    d0,d1
  2274.     move.l    iff_maxsize,d0
  2275.     cmp.l    d1,d0
  2276.     blt    not_iff    
  2277.  
  2278.     move.l    iff,a0
  2279.     move.l    #"CMAP",d0
  2280.     bsr    findhunk
  2281.     cmp.l    #-1,a0
  2282.     beq    not_iff
  2283.     bsr    decode_iff_cmap    
  2284.     
  2285.     move.l    iff,a0
  2286.     move.l    #"BODY",d0
  2287.  
  2288.     lea    mainscreen,a3
  2289.  
  2290.     bsr    findhunk
  2291.     cmp.l    #-1,a0
  2292.     beq    not_iff
  2293.     bsr    iff_body
  2294.  
  2295.     lea    iff_cmap,a0
  2296.     ;lea    cmap+2,a1
  2297.     ;move.w    iff_colours,d0
  2298.     ;sub.w    #1,d0
  2299. .cmaploop
  2300.     ;move.w    (a0)+,(a1)
  2301.     ;add.l    #4,a1
  2302.     ;dbf    d0,.cmaploop
  2303.  
  2304.     move.l    #mainscreen,d0
  2305.     move.l    iff_bmpsize,d1
  2306.     
  2307.     move.w    d0,bitplane0_lo
  2308.     swap    d0
  2309.     move.w    d0,bitplane0_hi
  2310.     swap    d0
  2311.     add.l    d1,d0
  2312.     move.w    d0,bitplane1_lo
  2313.     swap    d0
  2314.     move.w    d0,bitplane1_hi
  2315.     swap    d0
  2316.     add.l    d1,d0
  2317.     move.w    d0,bitplane2_lo
  2318.     swap    d0
  2319.     move.w    d0,bitplane2_hi
  2320.     swap    d0
  2321.     add.l    d1,d0
  2322.     move.w    d0,bitplane3_lo
  2323.     swap    d0
  2324.     move.w    d0,bitplane3_hi
  2325.     swap    d0
  2326.     add.l    d1,d0
  2327.     move.w    d0,bitplane4_lo
  2328.     swap    d0
  2329.     move.w    d0,bitplane4_hi
  2330.  
  2331.     moveq    #0,d0
  2332.     move.b    iff_depth,d0
  2333.     asl.w    #8,d0
  2334.     asl.w    #4,d0
  2335.     or.w    #$0200,d0
  2336.     ;move.w    d0,iff_res+2
  2337.  
  2338.     rts
  2339.  
  2340. not_iff:
  2341.     move.w    #$fff,bgc
  2342.  
  2343.     rts
  2344.  
  2345.     *************************************************************
  2346.  
  2347. decode_iff_cmap:
  2348.     
  2349.     move.l    4(a0),d0
  2350.     divu    #3,d0
  2351.     move.w    d0,iff_colours
  2352.  
  2353.     sub.w    #1,d0
  2354.     add.l    #8,a0
  2355.     lea    iff_cmap,a1
  2356. cmap_loop:        
  2357.     moveq    #0,d2
  2358.     
  2359.     moveq    #0,d1
  2360.     move.b    0(a0),d1
  2361.     asl.w    #4,d1
  2362.     or.w    d1,d2    
  2363.     moveq    #0,d1
  2364.     move.b    1(a0),d1
  2365.     or.w    d1,d2    
  2366.     moveq    #0,d1
  2367.     move.b    2(a0),d1
  2368.     lsr.w    #4,d1
  2369.     or.w    d1,d2    
  2370.  
  2371.     move.w    d2,(a1)+            ; store cmap
  2372.     add.l    #3,a0            ; next colour
  2373.     dbf    d0,cmap_loop    
  2374.  
  2375.     rts
  2376.  
  2377.     *************************************************************
  2378.  
  2379. iff_body:
  2380.     moveq    #0,d7
  2381.     moveq    #0,d6
  2382.     moveq    #0,d5
  2383.     move.w    iff_width,d5
  2384.     lsr.w    #3,d5
  2385.  
  2386.     move.l    a3,a2
  2387.     
  2388.     lea    8(a0),a1
  2389.     add.l    4(a0),a1
  2390.     add.l    #8,a0    
  2391.     cmp.b    #1,iff_compression
  2392.     beq    do_byterun1
  2393.     
  2394. .err    move.w    $dff006,$dff180
  2395.     bra    .err
  2396.  
  2397. do_byterun1:
  2398.     moveq    #0,d0
  2399.     move.b    (a0)+,d0
  2400.  
  2401.     cmp.b    #128,d0
  2402.     beq    iff_body_end            ; 128=nop
  2403.  
  2404.     bclr    #7,d0
  2405.     beq    iff_not_byterun
  2406.     
  2407.     moveq    #0,d1
  2408.     move.b    (a0)+,d1
  2409.  
  2410.     move.w    #128,d2
  2411.     sub.w    d0,d2
  2412.     move.w    d2,d0
  2413.     add.w    d0,d7
  2414.     add.w    #1,d7
  2415. iff_byterun1
  2416.     move.b    d1,(a2)+    
  2417.     dbf    d0,iff_byterun1
  2418.     bra    iff_body_end
  2419.     
  2420. iff_not_byterun
  2421.     add.w    d0,d7
  2422.     add.w    #1,d7
  2423. iff_not_byterun2
  2424.     move.b    (a0)+,(a2)+    
  2425.     dbf    d0,iff_not_byterun2
  2426. iff_body_end    
  2427.     cmp.w    d5,d7
  2428.     bne    .no_end
  2429.     
  2430.     move.w    #0,d7
  2431.     move.l    a3,a2
  2432.     move.l    iff_bmpsize,d0
  2433.     add.w    #1,d6
  2434.     move.l    d6,d1
  2435.     mulu    d1,d0
  2436.     add.l    d0,a2
  2437.     moveq    #0,d0
  2438.     move.b    iff_depth,d0
  2439.     cmp.w    d6,d0
  2440.     bne    .no_end
  2441.  
  2442.     moveq    #0,d6
  2443.     moveq    #0,d0
  2444.     move.w    iff_width,d0
  2445.     lsr.w    #3,d0
  2446.     add.l    d0,a3
  2447.     move.l    a3,a2    
  2448.  
  2449. .no_end
  2450.     cmp.l    a1,a0
  2451.     blt    do_byterun1    
  2452. .br1fin    
  2453.     rts
  2454.     
  2455.     *************************************************************
  2456.     
  2457. findhunk:
  2458.     lea    8(a0),a1
  2459.     add.l    4(a0),a1
  2460. .findloop
  2461.     cmp.l    a1,a0
  2462.     bge    .cantfind
  2463.     add.l    #2,a0
  2464.     move.l    (a0),d1
  2465.     cmp.l    d0,d1
  2466.     bne    .findloop
  2467.     rts
  2468. .cantfind    
  2469.     move.l    #-1,a0
  2470.     rts
  2471.  
  2472.     ********************************************************
  2473.  
  2474. calc_cmap:
  2475.     move.w    #0,d7
  2476.     lea    iff_cmap,a0
  2477.     lea    cmaplist,a1
  2478. cmaploop1:
  2479.     move.w    #15,d6
  2480. cmaploop2:    
  2481.     move.w    d6,d4
  2482.     asl.w    #1,d4
  2483.  
  2484.     move.w    d6,d5    
  2485.     cmp.w    #0,fadedir
  2486.     beq    nos1c
  2487.     not.w    d5
  2488. nos1c:
  2489.  
  2490.     move.w    (a0),d0
  2491.     and.w    #$00f,d0
  2492.     sub.w    d5,d0
  2493.     cmp.w    #0,d0
  2494.     bgt    nos1a
  2495.     move.w    #0,d0    
  2496. nos1a:    cmp.w    #$00f,d0
  2497.     blt    nos1b
  2498.     move.w    #$00f,d0
  2499. nos1b:
  2500.     
  2501.     move.w    d6,d5    
  2502.     cmp.w    #0,fadedir
  2503.     beq    nos2c
  2504.     not.w    d5
  2505. nos2c:    asl.w    #4,d5    
  2506.  
  2507.     move.w    (a0),d1
  2508.     and.w    #$0f0,d1
  2509.     sub.w    d5,d1
  2510.     cmp.w    #0,d1
  2511.     bgt    nos2a
  2512.     move.w    #0,d1    
  2513. nos2a:    cmp.w    #$0f0,d1
  2514.     blt    nos2b
  2515.     move.w    #$0f0,d1
  2516. nos2b:
  2517.  
  2518.     move.w    d6,d5    
  2519.     cmp.w    #0,fadedir
  2520.     beq    nos3c
  2521.     not.w    d5
  2522. nos3c:    asl.w    #8,d5    
  2523.  
  2524.     move.w    (a0),d2
  2525.     and.w    #$f00,d2
  2526.     sub.w    d5,d2
  2527.     cmp.w    #0,d2
  2528.     bgt    nos3a
  2529.     move.w    #0,d2    
  2530. nos3a:    cmp.w    #$f00,d2
  2531.     blt    nos3b
  2532.     move.w    #$f00,d2
  2533. nos3b:
  2534.  
  2535.     add.w    d1,d0
  2536.     add.w    d2,d0
  2537.     move.w    d0,(a1,d4.w)
  2538.  
  2539.     dbf    d6,cmaploop2
  2540.  
  2541.     add.l    #2,a0
  2542.     add.l    #32,a1
  2543.     add.w    #1,d7
  2544.     cmp.w    #32,d7
  2545.     blt    cmaploop1
  2546.  
  2547.     rts
  2548.  
  2549.  
  2550. fadeout:
  2551.     move.w    d0,fadedir
  2552.     bsr    calc_cmap
  2553.  
  2554.     
  2555.     lea    cmaplist,a1
  2556.     move.w    #15,d1
  2557. tmaploop2:
  2558.     lea    cmap+2,a0
  2559.     move.w    #31,d0
  2560.     move.l    a1,a2
  2561.  
  2562.     bsr    bpos
  2563.     bsr    bpos
  2564.     
  2565. tmaploop1:
  2566.     move.w    (a2),(a0)
  2567.     add.l    #4,a0
  2568.     add.l    #16*2,a2
  2569.     dbf    d0,tmaploop1
  2570.  
  2571.     add.l    #2,a1
  2572.     dbf    d1,tmaploop2
  2573.  
  2574.     rts
  2575.  
  2576.  
  2577. fadein:
  2578.     move.w    d0,fadedir
  2579.     bsr    calc_cmap
  2580.  
  2581.     lea    cmaplist+(15*2),a1
  2582.     move.w    #15,d1
  2583. omaploop2:
  2584.     lea    cmap+2,a0
  2585.     move.w    #31,d0
  2586.     move.l    a1,a2
  2587.  
  2588.     bsr    bpos
  2589.     bsr    bpos
  2590.  
  2591. omaploop1:
  2592.     move.w    (a2),(a0)
  2593.     add.l    #4,a0
  2594.     add.l    #16*2,a2
  2595.     dbf    d0,omaploop1
  2596.  
  2597.     sub.l    #2,a1
  2598.     dbf    d1,omaploop2
  2599.  
  2600.     rts
  2601.  
  2602. bpos:    cmp.b    #$ff,$dff006
  2603.     bne    bpos
  2604. .loop    cmp.b    #$ff,$dff006
  2605.     beq    .loop
  2606.     rts
  2607.  
  2608. cmaplist:        dcb.w    16*32,0
  2609. fadedir:            dc.l    0
  2610.  
  2611.  
  2612.  
  2613.     ********************************************************
  2614.  
  2615.     
  2616. my_copper:    
  2617. iff_res:        dc.w    $100,$5200    ; 4 bp - lo res
  2618.         dc.w    $104,$a        ; bp control reg
  2619.         dc.w    $108,0        ; bp modulo - odd
  2620.         dc.w    $10a,0        ; bp modulo - even
  2621.         dc.w    $180,0        ; colour 0 to black
  2622.         dc.w    $102,0
  2623.         
  2624.         dc.w    $08e,$2c81    ; bp window start left
  2625.         dc.w    $090,$30c1    ; bp window bot right
  2626.         dc.w    $94,$d0        ; bp stop horz
  2627.         dc.w    $92,$38
  2628.  
  2629.         dc.w    $120,0,$122,0
  2630.         dc.w    $124,0,$126,0
  2631.         dc.w    $128,0,$12a,0
  2632.         dc.w    $12c,0,$12e,0
  2633.         dc.w    $130,0,$132,0
  2634.         dc.w    $134,0,$136,0
  2635.         dc.w    $138,0,$13a,0
  2636.         dc.w    $13c,0,$13e,0
  2637.         
  2638.         dc.w      $e0
  2639. bitplane0_hi:    dc.w    0,$e2
  2640. bitplane0_lo:    dc.w    0,$e4
  2641. bitplane1_hi:    dc.w    0,$e6
  2642. bitplane1_lo:    dc.w    0,$e8
  2643. bitplane2_hi:    dc.w    0,$ea
  2644. bitplane2_lo:    dc.w    0,$ec
  2645. bitplane3_hi:    dc.w    0,$ee
  2646. bitplane3_lo:    dc.w    0,$f0
  2647. bitplane4_hi:    dc.w    0,$f2
  2648. bitplane4_lo:    dc.w    0
  2649.     
  2650. cmap:        dc.w    $180,$000
  2651.         dc.w    $182,$000
  2652.         dc.w    $184,$000
  2653.         dc.w    $186,$000
  2654.         dc.w    $188,$000
  2655.         dc.w    $18a,$000
  2656.         dc.w    $18c,$000
  2657.         dc.w    $18e,$000
  2658.         dc.w    $190,$000
  2659.         dc.w    $192,$000
  2660.         dc.w    $194,$000
  2661.         dc.w    $196,$000
  2662.         dc.w    $198,$000
  2663.         dc.w    $19a,$000
  2664.         dc.w    $19c,$000
  2665.         dc.w    $19e,$000
  2666.         dc.w    $1a0,$000
  2667.         dc.w    $1a2,$000
  2668.         dc.w    $1a4,$000
  2669.         dc.w    $1a6,$000
  2670.         dc.w    $1a8,$000
  2671.         dc.w    $1aa,$000
  2672.         dc.w    $1ac,$000
  2673.         dc.w    $1ae,$000
  2674.         dc.w    $1b0,$000
  2675.         dc.w    $1b2,$000
  2676.         dc.w    $1b4,$000
  2677.         dc.w    $1b6,$000
  2678.         dc.w    $1b8,$000
  2679.         dc.w    $1ba,$000
  2680.         dc.w    $1bc,$000
  2681.         dc.w    $1be,$000
  2682.                 
  2683.         dc.w    $ffe1,$fffe    ; end of ntsc screen
  2684.  
  2685. pic_down:    dc.w    $1c07,$fffe
  2686.         dc.w    $100,0
  2687.         
  2688.         dc.w      $e0
  2689. splane0_hi:    dc.w    0,$e2
  2690. splane0_lo:    dc.w    0,$e4
  2691. splane1_hi:    dc.w    0,$e6
  2692. splane1_lo:    dc.w    0,$e8
  2693. splane2_hi:    dc.w    0,$ea
  2694. splane2_lo:    dc.w    0
  2695.  
  2696.         dc.w    $0180,$0000,$0182,$0fff,$0184,$0fec,$0186,$0ec9
  2697.         dc.w    $0188,$0ca6,$018a,$0b94,$018c,$0a72,$018e,$0960
  2698.  
  2699.         dc.w    $108,swide*3    ; bp modulo - odd
  2700.         dc.w    $10a,swide*3    ; bp modulo - even
  2701. scroll_off:    dc.w    $102,0
  2702.         dc.w    $94,$d8        ; bp stop horz
  2703.         dc.w    $92,$30        ; bt start horz
  2704.  
  2705.         dc.w    $1e07,$fffe
  2706.         dc.w    $100,$3200
  2707.  
  2708.         dc.w    $3001,$ff00    ; end of pal screen
  2709.         dc.w    $9c,$8010    ; irq set bits - restart copper
  2710.         dc.w    $ffff,$fffe    ; end of copper list
  2711.  
  2712.  
  2713. scrollmem:    dcb.l    14*16*4
  2714. sfont:        incbin    "dh0:data/techno/ScrollFont.bin"
  2715.  
  2716.  
  2717.  
  2718.     section    mods,bss_c
  2719.  
  2720. mod_data1:    ds.l    36250
  2721. mod_data2:    ds.l    36250
  2722. workspace:    ds.l    $c80        ; dma for loader
  2723. mainscreen:    dcb.l    10*256*5
  2724. screen1:        dcb.l    10*256*1
  2725. screen2:        dcb.l    10*256*1
  2726. screen3:        dcb.l    10*256*1
  2727.  
  2728.     section    temp,data
  2729.     
  2730. my_mem:        dc.l    0
  2731. mt_data1:    dc.l    mod_data1
  2732. mt_data2:    dc.l    mod_data2
  2733. songended:    dc.l    0
  2734.  
  2735. volumespace:    dc.l    0
  2736. drive:        dc.w    0
  2737. temp:        dc.l    0
  2738. label:        dc.l    0
  2739. looklabel:    dc.l    0
  2740. loadaddress:    dc.l    0
  2741. diskaddress:    dc.l    0
  2742. loadlength:    dc.l    0
  2743. equon:        dc.w    0
  2744. scroll_trigger:    dc.w    0
  2745.     
  2746. iff_width:    dc.w    0        ; width in pixels
  2747. iff_height:    dc.w    0        ; height in pixels
  2748. iff_bmpsize:    dc.l    0        ; bitmap size
  2749. iff_depth:    dc.b    0        ; no. of bitplanes
  2750. iff_compression:    dc.b    0        ; compresstion type (0=bitmap, 1=byterun1)
  2751. iff_colours:    dc.w    0        ; no., of colours
  2752. iff_maxsize:    dc.l    40*256*5        ; max size allowed for iff pic
  2753. iff_cmap:    dcb.w    32,0        ; buffers for colourmap
  2754. iff:        dc.l    0        ; ptr to iff pic
  2755.  
  2756. scroll_ptr:    dc.l    scrolltext
  2757.  
  2758. screen1a:    dc.l    screen1
  2759. screen1b:    dc.l    screen2
  2760. screen1c:    dc.l    screen3
  2761.  
  2762.  
  2763. showsound1:    dc.l    null_sample
  2764. showsound2:    dc.l    null_sample
  2765. showsound3:    dc.l    null_sample
  2766. showsound4:    dc.l    null_sample
  2767. showlen1:    dc.l    0
  2768. showlen2:    dc.l    0
  2769. showlen3:    dc.l    0
  2770. showlen4:    dc.l    0
  2771. ss:        dc.l    0
  2772. sl:        dc.l    0
  2773.  
  2774. table:    
  2775.  
  2776. a set 32
  2777.     rept 32
  2778.     dc.w    a*40
  2779.     dc.w    a*40
  2780. a set a+1
  2781.     endr
  2782.     
  2783. a set 0
  2784.     rept 32
  2785.     dc.w    a*40
  2786.     dc.w    a*40
  2787. a set a+1
  2788.     endr
  2789.  
  2790. oldint:        dc.l    0
  2791. olddma:        dc.l    0
  2792. oldv3:        dc.l    0
  2793.  
  2794. diskptr:        dc.l    diskmap
  2795.  
  2796. diskmap:    dc.l    "TWAR",$00400,099754,0,$64E50037
  2797.     dc.l    "TWAR",$18A00,112604,0,$F3997123
  2798.     dc.l    "TWAR",$34200,078212,0,$CB21BD3
  2799.     dc.l    "TWAR",$47400,090644,0,$E7B6FA2A
  2800.     dc.l    "TWAR",$5D800,090226,0,$515E2C85
  2801.     dc.l    "TWAR",$73A00,111710,0,$E0C89426
  2802.     dc.l    "TWAR",$8F000,098280,0,$D7A7C441
  2803.     dc.l    "TWAR",$A7000,107450,0,$4758AF44
  2804.     dc.l    -1
  2805.  
  2806. null_sample:    dcb.b    400,0
  2807.  
  2808. main_pic:    incbin    "dh0:data/techno/main.iff"
  2809. intro_pic:    incbin    "dh0:data/techno/slanepic.iff"
  2810.  
  2811. gfxlib:        dc.b    "graphics.library",0
  2812.  
  2813. scrolltext:        incbin    "dh0:data/techno/scroll.txt"
  2814.     dc.b    0
  2815.  
  2816.         even
  2817.         
  2818.  
  2819.